Android P:服务行为更改

时间:2018-07-04 12:48:25

标签: java android service background-service

我最近在摆弄最新的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上

  1. onCreate()
  2. onStartCommand()

现在,从“最近”菜单中清除该应用程序后:

  1. onTaskRemoved()
  2. onCreate()
  3. onStartCommand()

这是我期望的行为。但是,当我在运行Android P DP4的较新手机上启动该应用程序时,启动该应用程序时的生命周期如下所示:

在Android P上

  1. onCreate()
  2. onStartCommand()

到目前为止,没有什么不同。但是,当我从最近的菜单中清除该应用程序时:

  1. onTaskRemoved()
  2. onCreate()
  3. onDestroy()

由于使用START_STICKY标志,因此即使有机会运行onStartCommand方法,该服务也会重新启动,但会立即被破坏。

我不知道有什么变化吗?我可以找到的与服务相关的东西的唯一变化记录在here中。它仅描述前台服务现在需要特定的权限才能工作。但是,我正在运行后台服务,因此此信息似乎与我无关。

有人遇到类似的问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找错误的Android版本的行为更改。 Android Oreo引入了Background Execution Limits,它在后台限制了服务。 TL; DR:在后台启动服务会抛出IllegalStateException,请改用Jobs