如何正确停止前台服务?
How to properly stop a foreground service?
我使用 startForeground 使我的服务 "persist" 处于后台并且不会被 OS 杀死。
我通过调用 stopForeground 和 stopService 在主 activity onDestroy 方法中删除了服务。
问题是,当我将我的应用程序从最近的应用程序中删除以将其终止时,调试会话仍然是 运行,而在 "normal" 运行中(不使用 startForeground),调试会话正确终止。
使用 adb shell 确认应用仍然是 运行.
startForeground 以某种方式创建了一个 "special" 运行 无法通过简单地停止前台和服务来停止的线程。
有什么想法吗?
我不知道它是否正确,但在我的应用程序上,我在这里停止了前台服务,它 works.Check 代码
private void stopForegroundService() {
// Stop foreground service and remove the notification.
stopForeground(true);
// Stop the foreground service.
stopSelf();
}
更新
以某种方式(不是从 onDestroy)从主 class 调用 stopservice
,如下所示:
Intent intent = new Intent(this, MyForeGroundService.class);
intent.setAction(MyForeGroundService.ACTION_STOP_FOREGROUND_SERVICE);
startService(intent);
MyForegroundService.java
private static final String TAG_FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
public static final String ACTION_START_FOREGROUND_SERVICE = "ACTION_START_FOREGROUND_SERVICE";
public static final String ACTION_STOP_FOREGROUND_SERVICE = "ACTION_STOP_FOREGROUND_SERVICE";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getAction();
switch (action) {
case ACTION_START_FOREGROUND_SERVICE:
startForegroundService();
break;
case ACTION_STOP_FOREGROUND_SERVICE:
stopForegroundService();
break;
}
}
return START_STICKY;
}
private void stopForegroundService() {
Log.d(TAG_FOREGROUND_SERVICE, "Stop foreground service.");
// Stop foreground service and remove the notification.
stopForeground(true);
// Stop the foreground service.
stopSelf();
}
如果您想在从最近的任务中清除您的应用程序时停止您的服务,您必须在清单文件中为服务定义一个属性stopWithTask
,如下所示
<service
android:enabled="true"
android:name=".ExampleService"
android:exported="false"
android:stopWithTask="true" />
然后你可以覆盖服务中的 onTaskRemoved 方法,当应用程序的任务被清除时会调用它
@Override
public void onTaskRemoved(Intent rootIntent) {
System.out.println("onTaskRemoved called");
super.onTaskRemoved(rootIntent);
//do something you want
//stop service
this.stopSelf();
}
我使用 startForeground 使我的服务 "persist" 处于后台并且不会被 OS 杀死。
我通过调用 stopForeground 和 stopService 在主 activity onDestroy 方法中删除了服务。
问题是,当我将我的应用程序从最近的应用程序中删除以将其终止时,调试会话仍然是 运行,而在 "normal" 运行中(不使用 startForeground),调试会话正确终止。
使用 adb shell 确认应用仍然是 运行.
startForeground 以某种方式创建了一个 "special" 运行 无法通过简单地停止前台和服务来停止的线程。
有什么想法吗?
我不知道它是否正确,但在我的应用程序上,我在这里停止了前台服务,它 works.Check 代码
private void stopForegroundService() {
// Stop foreground service and remove the notification.
stopForeground(true);
// Stop the foreground service.
stopSelf();
}
更新
以某种方式(不是从 onDestroy)从主 class 调用 stopservice
,如下所示:
Intent intent = new Intent(this, MyForeGroundService.class);
intent.setAction(MyForeGroundService.ACTION_STOP_FOREGROUND_SERVICE);
startService(intent);
MyForegroundService.java
private static final String TAG_FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
public static final String ACTION_START_FOREGROUND_SERVICE = "ACTION_START_FOREGROUND_SERVICE";
public static final String ACTION_STOP_FOREGROUND_SERVICE = "ACTION_STOP_FOREGROUND_SERVICE";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getAction();
switch (action) {
case ACTION_START_FOREGROUND_SERVICE:
startForegroundService();
break;
case ACTION_STOP_FOREGROUND_SERVICE:
stopForegroundService();
break;
}
}
return START_STICKY;
}
private void stopForegroundService() {
Log.d(TAG_FOREGROUND_SERVICE, "Stop foreground service.");
// Stop foreground service and remove the notification.
stopForeground(true);
// Stop the foreground service.
stopSelf();
}
如果您想在从最近的任务中清除您的应用程序时停止您的服务,您必须在清单文件中为服务定义一个属性stopWithTask
,如下所示
<service
android:enabled="true"
android:name=".ExampleService"
android:exported="false"
android:stopWithTask="true" />
然后你可以覆盖服务中的 onTaskRemoved 方法,当应用程序的任务被清除时会调用它
@Override
public void onTaskRemoved(Intent rootIntent) {
System.out.println("onTaskRemoved called");
super.onTaskRemoved(rootIntent);
//do something you want
//stop service
this.stopSelf();
}