android - 在android oreo中设备重启后PeriodicWorkRequest不起作用
问题描述
我需要根据以下逻辑向用户推送应用程序通知。
- A 类通知将在每 24 小时后显示。
- B 类通知将在每 7 天后显示。
- C 类通知将在每 15 天后显示。
我PeriodicWorkRequest
按如下方式使用了工作管理器,在设备重新启动之前它工作正常。设备重新启动后,我的工作不会被触发。
build.gradle ---
implementation 'android.arch.work:work-runtime:1.0.0-alpha04'
Java 代码
PeriodicWorkRequest showNotification =
new PeriodicWorkRequest.Builder(ShowNotificationWorkManager.class, interval,
TimeUnit.HOURS)
.addTag(notificationType)
.setInputData(myData)
.build();
getWorkManger().enqueue(showNotification);
解决方案
我已经尝试过这段代码并与我一起处理旧 API 和新 API:此代码在设备重新启动时每 15 分钟执行一次服务(workmanager)。对于 AndroidManifest.xml 文件:
<receiver android:name=".WorkManagerStartReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
在 WorkManagerStartReceiver 类上:
public class WorkManagerStartReceiver extends BroadcastReceiver {
WorkManager mWorkManager;
@Override
public void onReceive(Context context, Intent intent) {
PeriodicWorkRequest.Builder myWorkBuilder =
new PeriodicWorkRequest.Builder(TestWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS);
PeriodicWorkRequest myWork = myWorkBuilder.build();
mWorkManager = WorkManager.getInstance(context);
mWorkManager.enqueue(myWork);
}
}
而 TestWorker.class 是扩展 Worker 的类:
public class TestWorker extends Worker {
public TestWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
//your work that you want to execute here
return null;
}
}
如果您希望服务在应用程序打开时开始工作,则此代码段(在 MainActivity 上)会在应用程序打开时打开。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PeriodicWorkRequest.Builder myWorkBuilder =
new PeriodicWorkRequest.Builder(TestWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS);
PeriodicWorkRequest myWork = myWorkBuilder.build();
WorkManager.getInstance(MainActivity.this)
.enqueueUniquePeriodicWork("testworker", ExistingPeriodicWorkPolicy.KEEP, myWork);
}
推荐阅读
- java - Android应用程序中的Tensorflow Lite自定义对象检测模型错误
- javascript - 使用 TypeScript 进行迭代
- quarkus - 在运行时配置数据源类型
- android - Android应用程序可以在应用程序启动后请求麦克风权限吗
- html - 为什么相同的 HTML 代码在显示时会给出不同的结果
- drake - 实现一个允许在曲线路径中运动的关节
- python - 服务未在引导时启动
- c++ - Docker:构建后在容器内运行二进制文件 - 权限被拒绝
- mongodb - 在 docker 的 Mongo 容器中找不到 DB
- c++ - 任务完成,答案不被接受