Intereting Posts
Использование Android Intent.ACTION_SEND для отправки электронной почты Выбор намерения остается открытым при использовании Thread для получения ресурса изображения Выделить несколько столбцов с помощью RecyclerView Не удается получать сообщения с помощью Google Cloud Messaging для Android (а не вспомогательной библиотеки) Закрыть всплывающее окно Android с обратным нажатием Резервное копирование и восстановление виджетов на главном экране и живые обои Как закрыть диалоговое окно в Android программно? Как определить, способно ли устройство звонить и отправлять сообщения Как запустить Activity с FLAG_REORDER_TO_FRONT и FLAG_CLEAR_TOP Пользовательский интерфейс Android для работы JQuery – разрешить клавиатуру Autoshow на мобильных устройствах Пусть пользователь, который использует мобильный браузер, отправляет код продукта, который они хотят по SMS Имя атрибута <uses-permission> имеет недопустимый символ '' Вы должны сначала вызвать removeView () родителя ребенка с помощью AlertView Проверка в EditText позволяет использовать IP-адрес или веб-узел Url

Как остановить обслуживание самостоятельно?

Я запускаю службу в виде действия, после чего я хочу, чтобы служба перестала себя через некоторое время.

Я позвонил stopSelf () в службу, но он не работает.

Как заставить сервис останавливаться? благодаря!!!

Solutions Collecting From Web of "Как остановить обслуживание самостоятельно?"

Говоря «не работает», я предполагаю, что вы имеете в виду, что метод onDestroy() службы не вызывается.

У меня была та же проблема, потому что я привязал некоторые ServiceConnection к самой службе, используя флаг BIND_AUTO_CREATE . Это заставляет службу поддерживать работоспособность до тех пор, пока каждое соединение не будет отключено .

Как только я перейду на использование флага (ноль), у меня не возникло проблемы с убийством службы самостоятельно ( stopSelf() ).

Пример кода:

 final Context appContext = context.getApplicationContext(); final Intent intent = new Intent(appContext, MusicService.class); appContext.startService(intent); ServiceConnection connection = new ServiceConnection() { // ... }; appContext.bindService(intent, connection, 0); 

Убивание службы (не процесс):

 this.stopSelf(); 

Надеюсь, что это помогло.

stopSelf() , служба останавливается.

Убедитесь, что ни одна нить не работает в фоновом режиме, что заставляет вас чувствовать, что служба не остановлена.

Добавьте утверждения печати в поток.

Надеюсь это поможет.

Так как вы не опубликовали свой код, я не знаю точно, что вы делаете, но вы должны заявить, ЧТО вы останавливаетесь:

 this.stopSelf(); 

как в:

 public class BatchUploadGpsData extends Service { @Override public void onCreate() { Log.d("testingStopSelf", "here i am, rockin like a hurricane. onCreate service"); this.stopSelf(); } 

Если «не работает», вы имеете в виду, что процесс не убивается, вот как работает андроид. System.exit(0) или Process.killProcess(Process.myPid()) убьет ваш процесс. Но это не способ Android.

НТН

  stopForeground(true); stopSelf(); 

Я просто столкнулся с тем же вопросом. В моем случае у меня есть один сервисный менеджер, который я использую для связи с сервисом. В менеджере служба запускается следующим образом:

 context.bindService(new Intent(context, MyService.class), serviceConnection, Context.BIND_AUTO_CREATE); 

Удалив Context.BIND_AUTO_CREATE, как было предложено Alik Elzin, я смог остановить службу с помощью this.stopSelf () и вызвать onDestroy () при этом. Эта проблема заключается в том, что после этого я не смог перезапустить службу у менеджера, используя вышеприведенную команду.

Наконец, я исправил это, используя обратный вызов из службы, которая сообщает менеджеру остановить службу. Таким образом, менеджер всегда отвечает за запуск / остановку службы, и все работает нормально. Я не знаю, есть ли какие-либо счетные показания при этом.

Код очень прост. Создайте обратный вызов в службе и установите его в диспетчере, как это, в вашем классе подключения:

 private ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { myService = ((MyService.LocalBinder)service).getService(); myService.setCallback(new MyService.MyServiceCallback() { @Override public void onStop() { stopService(); } }); } public void onServiceDisconnected(ComponentName className) { myService = null; } }; 

И прекратить обслуживание:

 public void stopService() { if(mServiceConnection != null){ try { mContext.unbindService(mServiceConnection); } catch (Exception e) {} } mContext.stopService(new Intent(mContext, BleDiscoveryService.class)); } 

В сервисе просто вызовите myCallback.onStop (), когда вам нужно его остановить.

Другой грязный хак, не упомянутый здесь, – это исключение, подобное NPE. Однажды мне нужно было остановить InputMethodService, и этот хак был полезен.

Чтобы ваш сервис остановился, создайте класс BroadcastReceiver .. В своей службе позвоните своему получателю вот так ..

В сервисе

 sendBroadcast(new Intent("MyReceiver")); 

В широковещательном приемнике

  public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.stopService(new Intent(context,NotificationService.class)); } } 

Файл манифеста

  <receiver android:name="MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="MyReceiver"/> </intent-filter> </receiver>