安排android中的作业在特定时间运行

时间:2018-03-05 07:40:36

标签: android

我有一个Android应用程序需要每隔午夜将备份数据发送到我的云服务器。为此,我需要安排每24小时一次的工作。我读过有关AlarmManagerJobScheduler课程的内容,可以有效地安排工作。

在我的情况下,我使用的是JobScheduler类,这是我的 scheduleJob()方法,它将作业设置为在每86400000毫秒(即一天)之后安排。

@RequiresApi(api =Build.VERSION_CODES.LOLLIPOP)
public void scheduleJob(View v){
    JobInfo.Builder builder = new JobInfo.Builder(1,new ComponentName(this,JobSchedule.class));
    builder.setPersisted(true);
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
    builder.setPeriodic(86400000);
    builder.setRequiresCharging(false);
    builder.setRequiresDeviceIdle(false);
    builder.setBackoffCriteria(10000,JobInfo.BACKOFF_POLICY_EXPONENTIAL);

    int test = jobScheduler.schedule(builder.build());
    if(test <= 0){
        //sth went wrong
    }

}

我的问题是,我应该从哪里以及如何实现jobSchedule(),以便我可以让脚本在午夜12点完全运行。

另外,如果我从Android的Activity XYZ 的onCreate()方法调用scheduleJob方法,那么每次调用Activity XYZ 时,它都会覆盖onCreate方法()将被调用,并将安排一个额外的工作。那么我应该做什么以及从哪里安排工作,以便在整个应用程序生命周期内只安排一项工作?

总结一个例子,Whatsapp每天凌晨2点备份数据。即使我关闭了网络连接,它也会在我上线后立即备份我的数据。我想在我的应用程序中实现类似的功能。

2 个答案:

答案 0 :(得分:2)

您可以使用SharedPreference实现一次性执行。像这样的东西

SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
if (isFirstRun)
{
    // Code to run once
    SharedPreferences.Editor editor = wmbPreference.edit();
    editor.putBoolean("FIRSTRUN", false);
    editor.commit();
}

答案 1 :(得分:-1)

根据文档JobInfo Builder,默认情况下setRequieresCharging和setRequieresDeviceIdle设置为false,因此您无需将它们设置为false。