安排在Android中保留定期作业

时间:2018-04-18 09:04:09

标签: android

我想安排持久的定期工作,这取决于系统重启。安排工作的最佳地点是什么?我认为将调度安排到BOOT_COMPLETED广播接收器将重新安排"这项工作会带来意想不到的行为(至少它是多余的,不是吗?)。可能是MY_PACKAGE_REPLACED接收者吗?

感谢您的任何想法。

修改

我知道这个解决方案:https://stackoverflow.com/a/42084205/3974530

但我想要坚持不懈的工作。我害怕这样的情况:你有一个每24小时运行一次的定期工作。例如,每4小时重启一次设备。因此,每次重新启动后,作业将被重新安排...并且由于计时器已重置,您的作业将永远不会被执行。我对吗?

问题仅在于 JobScheduler

1 个答案:

答案 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
    }
}
}