奥利奥(Oreo)在后台运行STICKY服务

时间:2019-05-07 15:43:31

标签: android service

根据Android版本Oreo及更高版本中发生的最新更改,服务不再允许在后台运行。如果要在应用程序未运行时执行该服务,则必须去前台服务。这是否也意味着START_STICKY将不再起作用?

我尝试了以下代码

 public class MyService extends Service {
  private static final String TAG = "MyService";

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate: ");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand: ");
   new Thread(new Runnable() {
       @Override
       public void run() {
           for (int i = 0; i < 10; i++) {
               Log.d(TAG, "input : " + i);
               SystemClock.sleep(1000);
           }
       }
   }).start();
    Log.d(TAG, "onStartCommand: returning START STICKY");
    return START_STICKY;
}

@Override
public void onDestroy() {
    Log.d(TAG, "onDestroy: ");
    super.onDestroy();
  }
 }

这是一个简单的服务,它在内部创建线程并打印数字。

我运行此服务(在Oreo下方的设备上),并且该服务开始打印数字后,我退出了该应用程序。现在,我可以看到该服务在几秒钟后重新启动,这是预期的。

现在,我在Oreo设备中运行相同的代码。但是,在强制退出应用程序之后,该服务也会像下面的Oreo设备一样重新启动。那么,这是否意味着START_STICKY将重新启动服务,并且即使在Orero中它仍将以静默方式执行?限制仅用于从后台启动新服务吗?

1 个答案:

答案 0 :(得分:0)

如果您的应用程序位于前台,则它会暂时列入白名单,并且可以不受限制地启动服务。

它没有指定持续多长时间,但是当您的应用程序进入后台时,它将被从该白名单中删除,并且不再能够启动非前台服务。