Android 在准确时间使用作业计划程序执行后台任务

Android 在准确时间使用作业计划程序执行后台任务,android,alarmmanager,android-workmanager,android-jobscheduler,Android,Alarmmanager,Android Workmanager,Android Jobscheduler,我正在开发新闻应用程序。我需要每天获得一次最新消息。为此,我使用了Jobscheduler。以下是代码: ComponentName componentName = new ComponentName(this, JobService.class); JobInfo jobInfo = new JobInfo.Builder(123, componentName) .setRequiresCharging(false)

我正在开发新闻应用程序。我需要每天获得一次最新消息。为此,我使用了Jobscheduler。以下是代码:

ComponentName componentName = new ComponentName(this, JobService.class);
        JobInfo jobInfo = new JobInfo.Builder(123, componentName)
                .setRequiresCharging(false)
                .setPeriodic(24 * 60 * 60 * 1000)
                .setPersisted(true)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .build();
        JobScheduler jobScheduler = (JobScheduler)getApplicationContext().getSystemService(JOB_SCHEDULER_SERVICE);
        int resultCode = jobScheduler.schedule(jobInfo);

        if (resultCode == JobScheduler.RESULT_SUCCESS){
            Log.d(TAG, "Job Scheduled");
        }
        else {
            Log.d(TAG, "Job Scheduling failed");
        }
但是现在我需要在早上6点以后做一次这项工作,那时会有互联网连接。
有没有一种方法可以通过作业调度程序实现这一点。我知道我可以使用Alarm Manager来实现这一点,但在连接、设备充电等情况下,作业调度程序要比Alarm Manager好得多。或者我可以使用Workmanager实现这一点,如果需要,Workmanager使用作业调度器和AlarmManager。或者有其他的方法吗???任何建议都会通知您。

您可以使用广播接收器和工作经理,让您知道连接可用,并完成计划任务您可以在上午6:00后每15分钟触发一次Worker(连续两个Worker的最短时间)检查互联网是否可用并执行您的工作

您可以使用广播接收器和工作管理器,让您知道连接可用并完成计划的任务您可以在上午6:00后每15分钟触发一次Worker(连续两个Worker的最短时间)检查互联网是否可用并完成您的工作

我可以使用alarm manager在每天早上6:00启动作业调度程序吗?alarm manager在Android 6+设备上无法正常工作,因为电池消耗过多,所以您必须使用广播接收器+作业调度程序,有点像下面的答案,您可以在何处执行上述回答是的,您可以使用并启动类似此AlarmReceiver.setAlarm(true);/*true将强制广播*/我可以使用alarm manager在每天早上6:00启动作业调度程序吗?alarm manager在Android 6+设备上无法正常工作,因为电池消耗过多,所以您必须使用广播接收器+作业调度程序,有点像下面的答案,您可以在何处执行上述回答是的,您可以使用并启动类似此AlarmReceiver.setAlarm(true);/*true将强制广播*/在工作经理示例中,我如何设置准确时间???这可能吗?在这里的工作经理示例中,我如何设置准确的时间???这可能吗?
public static final String CUSTOM_INTENT = "com.test.intent.action.ALARM";
public static Context ctx = OfferlyApplication.getContext();

@Override
public void onReceive(Context context, Intent intent) {
    /* enqueue the job */
    AlarmJobIntentService.enqueueWork(context, intent);
}
public static void cancelAlarm() {
    AlarmManager alarm = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);

    /* cancel any pending alarm */
    alarm.cancel(getPendingIntent());
}
public static void setAlarm(boolean force) {
    cancelAlarm();
    AlarmManager alarmManager = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
    // EVERY X MINUTES
    long delay = (1000 * 60 * 60);
    long when = System.currentTimeMillis();
    if (!force) {
        when += delay;
    }
    /* fire the broadcast */
    PendingIntent pendingIntent = getPendingIntent();
    int SDK_INT = Build.VERSION.SDK_INT;
    if (SDK_INT < Build.VERSION_CODES.KITKAT)
        alarmManager.set(AlarmManager.RTC_WAKEUP, when, pendingIntent);
    else if (SDK_INT < Build.VERSION_CODES.M)
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, when, pendingIntent);
    else {
        Log.d("JOB_SCHEDULING","waking device");
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, when, pendingIntent);
    }
}
private static PendingIntent getPendingIntent() {
    //Context ctx;   /* get the application context */
    Intent alarmIntent = new Intent(ctx, AlarmReceiver.class);
    alarmIntent.setAction(CUSTOM_INTENT);
    return PendingIntent.getBroadcast(ctx, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
}
 Constraints myConstraints = new Constraints.Builder()
            .setRequiresDeviceIdle(false)
            .setRequiresCharging(false)
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .setRequiresBatteryNotLow(true)
            .setRequiresStorageNotLow(true)
            .build();

    PeriodicWorkRequest saveRequest =
            new PeriodicWorkRequest.Builder(NotificationWorker.class, 60, TimeUnit.MINUTES)
                    .setConstraints(myConstraints)
                    .build();

    WorkManager.getInstance()
            .enqueue(saveRequest);