在Android 12中,setExpedited是否是应用进入后台时执行长时间运行任务的替代方式?

hwamh0ep  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(244)

从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();
  1. setExpedited的底层机制是什么,使它不同于正常的作业?
    1.当应用程序进入后台时,它是否可以用于执行长时间运行的任务?
    或者,这是否意味着,在正常情况下,后台应用程序无法启动长时间运行的任务?
yvfmudvl

yvfmudvl1#

setExpedited与长时间运行的任务完全无关,它只是让请求尽快得到处理,而不是等待一个方便的窗口,在那里操作系统同时运行一堆任务。
您需要覆盖Worker中的getForegroundInfo()类,以便为正在进行的任务提供有效的通知通道(如果您不这样做,您的应用程序将崩溃)。如果您的Worker线程运行时间超过10秒,操作系统将显示正在进行的通知,告诉用户有东西正在后台运行

相关问题