Я запускаю службу в действии, затем хочу, чтобы служба через некоторое время остановилась.
Я вызвал stopSelf() в сервисе, но он не работает.
Как заставить сервис остановиться сам?
Я запускаю службу в действии, затем хочу, чтобы служба через некоторое время остановилась.
Я вызвал stopSelf() в сервисе, но он не работает.
Как заставить сервис остановиться сам?
Говоря "не работает", я думаю, вы имеете в виду, что метод 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();
Надеюсь, что это помогло.
Вызывая 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, как предложил Алик Эльзин, я смог остановить службу с помощью 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>
если вы используете отдельную Thread
в службе, после прекращения службы по телефону stopSelf()
или stopService()
Thread
продолжает работать. если и хочет, чтобы остановить Thread
и должны вызывать Thread.interrupted()
в Thread
(это может вызвать Exception
, если Thread
спит)
Используйте stopSelf(), чтобы остановить службу от самого себя.