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

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

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

Как заставить сервис остановиться сам?

Ответ 1

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

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

Как только я перейду на использование флага (ноль), у меня не было проблем с убийством службы (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();

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

Ответ 2

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

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

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

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

Ответ 3

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

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();
    }

Ответ 4

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

НТН

Ответ 5

   stopForeground(true);
            stopSelf();

Ответ 6

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

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

Удалив Context.BIND_AUTO_CREATE, как предложил Алик Эльзин, я смог остановить службу с помощью 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(), когда вам нужно его остановить.

Ответ 7

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

Ответ 8

Чтобы ваша служба остановилась, создайте класс 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>

Ответ 9

если вы используете отдельную Thread в службе, после прекращения службы по телефону stopSelf() или stopService() Thread продолжает работать. если и хочет, чтобы остановить Thread и должны вызывать Thread.interrupted() в Thread (это может вызвать Exception, если Thread спит)

Ответ 10

Используйте stopSelf(), чтобы остановить службу от самого себя.