Application.OnCreate
期间启动(直接调用context.startService
),还通过AlarmManager
稍后启动(重构正在进行以将其部分工作迁移到JobScheduler)。我们的应用程序还有一个
BroadcastReceiver
,它会使用其直接意图启动。鉴于Android Oreo的新限制(https://developer.android.com/about/versions/oreo/android-8.0-changes.html),我们遇到了以下问题:
- 应用程序/进程在后台/死亡状态
- 操作系统触发BroadcastReceiver
- Application.onCreate()在BroadcastReceiver之前执行
- Application.onCreate()代码尝试运行服务
我知道CommonsWare在这里https://dev59.com/eVcP5IYBdhLWcg3wXI7Z#44505719回答了启动Service的新推荐方式,但对于这种特定情况,我只想要if(process in foreground) { startService }
。我目前正在使用以下方法,它似乎可以工作:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static boolean isProcessInForeground_V21(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.AppTask> tasks = am.getAppTasks();
return tasks.size() > 0;
}
但我找不到Android Oreo正在执行的确切检查(我已经到达https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/ContextImpl.java的
startServiceCommon
方法,但从那里requireForeground
标志似乎进入了一些本地实现)。所以我的问题是:
针对Android Oreo新限制的特定目的,在调用
startService
之前如何检查我的进程是否在前台?
onCreate()
方法中启动服务。只有在需要服务时才启动服务。如果你的应用程序在前台,那么服务是无用的。 - CommonsWare