如何在主线程中没有执行代码的情况下保持粘性服务的活动?

时间:2018-05-02 00:30:16

标签: java android service event-handling

我的应用程序有一项服务,即使在用户关闭它之后也需要保持活动状态(通过轻扫它)。我的服务每秒在并行线程中打印日志消息。

虽然它确实返回START_STICKY,但只要用户关闭了应用程序,它就会终止。这是我的onStartCommand方法:

public int onStartCommand(Intent intent, int flags, int startId) {

    super.onStartCommand(intent, flags, startId);
    instance = this;
    Log.i("Service", "started");
    new Thread(() -> {
        int i = 0;
        while (true) {
            Log.i("Service", "#" + ++i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

    start_recording(null);


    return START_STICKY;
}

我也在清单中声明了它:

<service
    android:name=".MyService"
    android:stopWithTask="false"
/>

如何在应用程序退出时阻止系统杀死线程?没有其他SO帖子为我提供了有效的解决方案。

1 个答案:

答案 0 :(得分:1)

基于documentation

  

当应用进入后台时,它有几个窗口   仍允许创建和使用服务的分钟数。在   该窗口结束时,该应用程序被视为空闲。 在这   时间,系统停止应用程序的后台服务,就好像   app调用了服务'Service.stopSelf()方法

Android O操作系统开始,对可以自由执行后台服务的情况实施了若干限制。应用程序退出后X分钟,服务将被终止,就像调用stopSelf()一样。如果您仍想继续,则需要使用ForegroundService,但需要考虑对电池寿命的影响。如果您执行CPU密集型工作,那么使用ForegroundService将无济于事。

有关详细信息,请参阅此SO中的答案。