在Android中安排一个特定时间运行的任务

8
我有一个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个回答

3
你可以使用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();
}

2
这是我发现的最佳实现一次性执行的方法。然而,我想知道如何在每天特定时间(在我的情况下是午夜12点)执行任务的方法。 - Shubham Shekhar
您可以在作业调度程序中使用setperiodic,但由于Android系统的电池优化,它不能保证精确的时间执行,并且作业调度程序不适用于旧版本的Android。Firebase JobDispatcher是另一个选项,您可以使用.setTrigger(Trigger.executionWindow(, )),它将支持旧版本。 - MarGin

-1
根据文档 JobInfo Builder,setRequieresCharging和setRequieresDeviceIdle默认为false,因此您不需要将它们设置为false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接