我最近在摆弄最新的Android P版本,尝试运行带有START_STICKY
标志的简单服务。
基本上,这是我的设置:
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstance) {
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
}
MyService.java
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate()");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy()");
}
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
Log.d(TAG, "onTaskRemoved()");
}
@Override
public void onLowMemory() {
super.onLowMemory();
Log.d(TAG, "onLowMemory()");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand()");
return START_STICKY;
}
}
当然,我已经在应用程序的AndroidManifest文件中添加了一个服务条目。 在运行Android Nougat的旧手机上测试该应用程序,一切正常。 启动应用程序后,生命周期如下所示:
在Android N上
现在,从“最近”菜单中清除该应用程序后:
这是我期望的行为。但是,当我在运行Android P DP4的较新手机上启动该应用程序时,启动该应用程序时的生命周期如下所示:
在Android P上
到目前为止,没有什么不同。但是,当我从最近的菜单中清除该应用程序时:
由于使用START_STICKY
标志,因此即使有机会运行onStartCommand
方法,该服务也会重新启动,但会立即被破坏。
我不知道有什么变化吗?我可以找到的与服务相关的东西的唯一变化记录在here中。它仅描述前台服务现在需要特定的权限才能工作。但是,我正在运行后台服务,因此此信息似乎与我无关。
有人遇到类似的问题吗?
谢谢!
答案 0 :(得分:1)
您正在寻找错误的Android版本的行为更改。 Android Oreo引入了Background Execution Limits,它在后台限制了服务。 TL; DR:在后台启动服务会抛出IllegalStateException
,请改用Jobs
。