我需要根据以下逻辑将应用通知推送给用户。
我已按如下方式使用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);
答案 0 :(得分:5)
我已经尝试过此代码并与我一起使用旧的API和新的API: 该代码在设备重启时每15分钟执行一次服务(工作管理器)。 对于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);
}
答案 1 :(得分:0)
在设备完成启动后触发的BroadcastReceiver中重新启动PeriodicWorkRequest。像这样的意图过滤器。
<receiver
android:name=".warrantyregistration.boot.BootReceiver"
android:enabled="@bool/configuration_for_receiver_service">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
this答案说明了设备重启时OneTimeWorkRequest的行为。
答案 2 :(得分:0)
请在您的android清单中添加以下权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
答案 3 :(得分:0)
您致电了window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$']],
macros: {
"⌊": '{\\lfloor}',
"⌋": '{\\rfloor}'
}
}
};
。相反,您应该加入定期工作,因为您的工作是定期操作:
getWorkManger().enqueue(showNotification)
答案 4 :(得分:-1)
在设备上首次启动应用程序时,可以安排一次定期工作请求。我们可以使用共享首选项来确定该应用是否是首次启动。此外,为了在启动后重复工作,我们可以在BroadcastReceiver中启动工作,该工作将在重启设备后触发。
答案 5 :(得分:-1)
重新启动设备后,Sadly WorkManager确实无法正常工作。 但是好消息是您可以通过其他方式使它工作。
只需定义一个BroadcastReceiver并使用onReceive(-)方法调度WorKManager。
public class WorkManagerStartReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(false)
.build();
PeriodicWorkRequest saveRequest =
new PeriodicWorkRequest.Builder(ToastWorker.class, 15, TimeUnit.MINUTES)
.setConstraints(constraints)
.build();
WorkManager.getInstance(context)
.enqueue(saveRequest);
} }
现在在 manifest.xml 文件
中定义您的BroadcastReceiver<application
----
>
<activity android:name=".MainActivity"/>
<receiver android:name=".WorkManagerStartReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
嘿,别忘了在清单文件 android.permission.RECEIVE_BOOT_COMPLETED
中添加启动权限