如何正确停止前台服务?

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