如何正确停止前台服务?

时间:2018-11-16 08:43:40

标签: android service foreground-service

我使用startForeground在后台使我的服务“持久”并且不会被操作系统杀死。
我通过调用stopForeground和stopService在主要活动onDestroy方法中删除该服务。 问题是,当我从最近的应用程序中删除我的应用程序以杀死它时,调试会话仍在运行,而在“正常”功能(不使用startForeground)下,调试会话正确终止。
使用adb shell确认该应用程序仍在运行。
startForeground以某种方式创建了一个“特殊的”运行线程,仅通过停止前台和服务就无法将其停止。
有什么想法吗?

2 个答案:

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