我想安排持久的定期工作,这取决于系统重启。安排工作的最佳地点是什么?我认为将调度安排到BOOT_COMPLETED
广播接收器将重新安排"这项工作会带来意想不到的行为(至少它是多余的,不是吗?)。可能是MY_PACKAGE_REPLACED
接收者吗?
感谢您的任何想法。
修改
我知道这个解决方案:https://stackoverflow.com/a/42084205/3974530
但我想要坚持不懈的工作。我害怕这样的情况:你有一个每24小时运行一次的定期工作。例如,每4小时重启一次设备。因此,每次重新启动后,作业将被重新安排...并且由于计时器已重置,您的作业将永远不会被执行。我对吗?
问题仅在于 JobScheduler !
答案 0 :(得分:-1)
BOOT_COMPLETED
是第一个正确的步骤。
你这样做:
首先,在AndroidManifest.xml中
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
您创建了一个扩展GcmTaskService
的服务。
在这里,你创建一个公共静态方法setupGcmTasks,你必须@override onInitializeTasks
。当您的应用更新时,会调用此回调。
这里的关键是,您为任务设置了updateCurrent(true)
,因此它取代了现有的任务,使您更容易(重新安排等)。
public class MyTaskService extends GcmTaskService {
public static void setupGcmTasks(@NonNull Context context) {
GcmNetworkManager networkManager = GcmNetworkManager.getInstance(context);
Task task = new PeriodicTask.Builder()... // create your task
.setTag(YOUR_TASK_TAG)
.setUpdateCurrent(true)
.setPersisted(true)
.build();
networkManager.schedule(task);
}
@Override
public void onInitializeTasks() {
super.onInitializeTasks();
setupGcmTasks(getApplicationContext());
}
@Override
public int onRunTask(TaskParams taskParams) {
try {
switch (taskParams.getTag()) {
case YOUR_TASK_TAG:
// Do your stuff
break;
}
} catch (Exception e) {
// Log it
}
return GcmNetworkManager.RESULT_SUCCESS;
}
}
最后,设备启动BroadcastReceiver
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction() != null &&
intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
myTaskService.setupGcmTasks(context); // Call the static of your service
}
}
}