android - 如何确保在 Android N 及更高版本上的设备重启时调用 PeriodicWorkRequest

标签 android broadcastreceiver android-workmanager

我最近尝试使用 WorkManagerPeriodicWorkRequest s 作为在后台定期获取用户位置更新的可靠方法。该库满足了我的要求,这个特殊的细节引起了我的注意:

Guarantees task execution, even if the app or device restarts



实现和测试后,我尝试重新启动我的设备并注意到日志消息和应用程序通知从未出现。

自然地,我做了一些研究,偶然发现了这个:PeriodicWorkRequest not working after device reboot in android oreo

所以我尝试使用 BOOT_COMPLETED广播接收器在设备重新启动时触发 WorkRequest,但它不起作用。我查了很多BOOT_COMPLETED接收者关于 SO 的问题,但没有一个有效,除了这里:Broadcast Receiver Not Working After Device Reboot in Android但这涉及让用户选择您的应用程序作为 AccessibilityService在我看来,这是对 UX 的阻碍。

经过一番研究,我发现 WorkManager 在后台使用 BOOT_COMPLETED BroadcastReceiver。到目前为止,我一直在 Android Nougat 和 Oreo 设备上进行测试,因此我在运行 API 16 的 Samsung 和运行 API 22 的 HTC 上测试了 BroadcastReceiver。他们也工作了!

这是我如何实现我的PeriodicWorkRequest
PeriodicWorkRequest request =
                new PeriodicWorkRequest.Builder(LocationListenerWorker.class,
                        12, HOURS)
                        .build();

        mWorkManager.enqueueUniquePeriodicWork(Constants.LOCATION_TASK_ID,
                ExistingPeriodicWorkPolicy.REPLACE, request);

对于如何确保在运行 API 24+ 的设备上重新启动设备时也调用请求的任何帮助,我们将不胜感激

最佳答案

假设您已经定义了一个 RebootWorker 类,它扩展了 Worker 并在设备重新启动后执行一些特定的工作。第一种方法:

public class RebootWorker extends Worker {
...............................
}

在那种情况下,在 list 中定义了这个 worker
<service
    android:name=".RebootWorker"
    android:process=":worker"/> 

这将有助于让 Workmanger 在设备重启后运行您的工作服务。因为由于设备重启,您的应用程序已从任务管理器中清除。

第二种方法:您也可以使用 BroadcastReceiver 来监听 Boot 完成的 Action
public class MyReceiver extends BroadcastReceiver {
    WorkManager mWorkManager;
    PeriodicWorkRequest rebootRequest;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(MainActivity.TAG, "intent.getAction(): "+intent.getAction());

        //Reboot worker
        mWorkManager = WorkManager.getInstance(context);
        rebootRequest = new PeriodicWorkRequest.Builder(RebootWorker.class,
                MainActivity.REPEAT_INTERVAL, MainActivity.TIME).build();

        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
           //do your work and enqueue it 
            mWorkManager.enqueue(rebootRequest);
}
}
}

关于android - 如何确保在 Android N 及更高版本上的设备重启时调用 PeriodicWorkRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305619/

相关文章:

android - 组合 WorkContinuation 没有按预期工作

android - Workmanger : Getting Exception kotlinx. coroutines.JobCancellationException 的长时间运行 Worker 问题:Kotlin 中的 CoroutineWorker 中的作业被取消

PopupWindow 内的 Android 按钮

android - 在 alertDialog android 中显示 ListView

java - 解析更新对象而不更改updatedAt

android - 是否有任何广播接收器能够判断消息何时被读取?

android - 在广播接收器中启动 Activity 以获得结果?

应用程序被杀死时的Android多个 Activity 任务

android - 使用待定 Intent 区分按钮点击

android - 找不到@HiltWorker注解