Выполнение фоновых задач с использованием Job Scheduler в точное время - PullRequest
1 голос
/ 20 февраля 2020

Я работаю над приложением новостей. И мне нужно было получать последние новости раз в день. Для этого я использовал Jobsheduler. Вот код:

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:00, когда будет соединение inte rnet. Есть ли способ сделать это с помощью Job Scheduler. Я знаю, что могу сделать это с помощью диспетчера тревог, но планировщик заданий гораздо лучше, чем диспетчер тревог, в таких условиях, как при наличии соединения, при зарядке устройства. Или я могу добиться этого с помощью Workmanager, который использует планировщик заданий и AlarmManager, если это необходимо. Или есть другой способ сделать это ??? Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020
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);
}

или с помощью диспетчера работы для периодов c работников

 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);
0 голосов
/ 20 февраля 2020

Вы можете использовать широковещательный приемник вместе с Диспетчером работ, который сообщает, что соединение доступно, и завершить запланированное задание. ИЛИ Вы можете запускать Worker каждые 15 минут после 6:00 (минимальное время для 2 последовательных работников) и проверьте, доступен ли inte rnet и выполняете ли вы свою работу

...