我使用startForeground在后台使我的服务“持久”并且不会被操作系统杀死。
我通过调用stopForeground和stopService在主要活动onDestroy方法中删除该服务。
问题是,当我从最近的应用程序中删除我的应用程序以杀死它时,调试会话仍在运行,而在“正常”功能(不使用startForeground)下,调试会话正确终止。
使用adb shell确认该应用程序仍在运行。
startForeground以某种方式创建了一个“特殊的”运行线程,仅通过停止前台和服务就无法将其停止。
有什么想法吗?
答案 0 :(得分:2)
如果要在从近期任务中清除应用程序时停止服务,则必须在清单文件中定义服务的属性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();
}
答案 1 :(得分:0)
我不知道它是否正确,但是在我的应用程序上,我在这里停止前台服务并且它可以正常工作。请检查代码
private void stopForegroundService() {
// Stop foreground service and remove the notification.
stopForeground(true);
// Stop the foreground service.
stopSelf();
}
更新
以某种方式(不是从onDestroy)从您的主类中调用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();
}