根据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中它仍将以静默方式执行?限制仅用于从后台启动新服务吗?
答案 0 :(得分:0)
如果您的应用程序位于前台,则它会暂时列入白名单,并且可以不受限制地启动服务。
它没有指定持续多长时间,但是当您的应用程序进入后台时,它将被从该白名单中删除,并且不再能够启动非前台服务。