从Android 12开始,在启动前台服务时对后台应用进行了新的限制。
面向Android 12(API级别31)或更高版本的应用在后台运行时无法启动前台服务,少数特殊情况除外。
以下是我们的使用案例。
在Android 12之前,当我们的应用在onPause(LifecycleOwner owner)
期间进入后台时,我们将使用前台服务来执行长时间运行的云同步任务。
在Android 12之前
public class CloudWorker extends Worker {
public CloudWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
...
setForegroundAsync(foregroundInfo);
...
}
}
有了这样机制,我们可以有一个长时间运行的任务,而不会被操作系统杀死。
在Android 12中
Google的建议是使用setExpedited
。(https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work)
OneTimeWorkRequest oneTimeWorkRequest =
new OneTimeWorkRequest.Builder(CloudWorkerV31.class)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.addTag(CloudWorkerV31.TAG)
.build();
但是,从文档来看,并不完全清楚setExpedited
的行为。
使用setExpedited
与不使用setExpedited
的作业有何不同?
OneTimeWorkRequest oneTimeWorkRequest =
new OneTimeWorkRequest.Builder(CloudWorkerV31.class)
.addTag(CloudWorkerV31.TAG)
.build();
setExpedited
的底层机制是什么,使它不同于正常的作业?
1.当应用程序进入后台时,它是否可以用于执行长时间运行的任务?
或者,这是否意味着,在正常情况下,后台应用程序无法启动长时间运行的任务?
1条答案
按热度按时间yvfmudvl1#
setExpedited
与长时间运行的任务完全无关,它只是让请求尽快得到处理,而不是等待一个方便的窗口,在那里操作系统同时运行一堆任务。您需要覆盖Worker中的
getForegroundInfo()
类,以便为正在进行的任务提供有效的通知通道(如果您不这样做,您的应用程序将崩溃)。如果您的Worker线程运行时间超过10秒,操作系统将显示正在进行的通知,告诉用户有东西正在后台运行