Как установить точное время работы андроида для ежедневной работы в назначенное время?

Я пытаюсь запланировать работу, которая будет выполняться в 10 вечера ежедневно.

Я попытался использовать метод setExact и предоставить миллисекунды, преобразовав 22 часа в миллисекунды. Для тестирования я запустил приложение и изменил системное время на 10 вечера, но задание не было выполнено.

Я также попытался дать время прихода, преобразованное 12:45 в миллисекунды и присвоенное методу setExact. Но это также не сработало.

Как я могу установить это и проверить?

FileTrackJob

class FileTrackJob extends Job {

        static final String TAG = "FileTracking";

        @NonNull
        @Override
        protected Result onRunJob(Params params) {

            PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 0,
                    new Intent(getContext(), MainActivity.class), 0);

            Calendar cal = Calendar.getInstance();
            Date currentLocalTime = cal.getTime();
            DateFormat date = new SimpleDateFormat("HH:mm a");
    // you can get seconds by adding  "...:ss" to it
            String localTime = date.format(currentLocalTime);

            Notification notification = new NotificationCompat.Builder(getContext())
                    .setContentTitle("Android Job Demo")
                    .setContentText("Notification from Android Job Demo App. " + localTime)
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setShowWhen(true)
                    .setColor(Color.RED)
                    .setLocalOnly(true)
                    .build();

            NotificationManagerCompat.from(getContext())
                    .notify(new Random().nextInt(), notification);


            return Result.SUCCESS;
        }

        static void scheduleNoti() {
            new JobRequest.Builder(TrackingJob.TAG)
                    //  .setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(15))
                    .setExact(44820000)
                    .setUpdateCurrent(true)
                    .setPersisted(true)
                    .build()
                    .schedule();
        }
    }

Основная деятельность

FileTrackJob.scheduleNoti();

MainApp

public class MainApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        JobManager.create(this).addJobCreator(new DemoJobCreator());
    }
}

DemoJobCreator

class DemoJobCreator implements JobCreator {

    @Override
    public Job create(String tag) {
        switch (tag) {
            case TrackingJob.TAG:
                return new TrackingJob();

            case FileTrackJob.TAG:
                return new FileTrackJob();
            default:
                return null;
        }
    }
}

Также я запланировал одну периодическую работу, эта работа не работает на некоторых устройствах, таких как red mi, на одном устройстве samsung это не повторяется, но на moto g4 plus это работало хорошо.

class TrackingJob extends Job {

    static final String TAG = "tracking";

    @NonNull
    @Override
    protected Result onRunJob(Params params) {

        Intent pi = new Intent(getContext(), GetLocationService.class);
        getContext().startService(pi);


        return Result.SUCCESS;
    }

    static void schedulePeriodic() {
        new JobRequest.Builder(TrackingJob.TAG)
                .setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(15))
                .setUpdateCurrent(true)
                .setPersisted(true)
                .build()
                .schedule();
    }
}

Может кто-нибудь помочь с этим, пожалуйста? Спасибо..

1 ответ

Вы должны использовать DailyJob вместо Job делать что-то в определенное время ежедневно.

public static final class MyDailyJob extends DailyJob {

    public static final String TAG = "MyDailyJob";

    public static void schedule() {
        // schedule between 1 and 6 *PM*
        DailyJob.schedule(new JobRequest.Builder(TAG), TimeUnit.HOURS.toMillis(13), TimeUnit.HOURS.toMillis(18));
    }

    @NonNull
    @Override
    protected DailyJobResult onRunDailyJob(Params params) {
        return DailyJobResult.SUCCESS;
    }
}

Плюс: если вы хотите установить конкретные минуты и секунды, используйте (предположим, между 15:48:05 и 17:42:09):

    DailyJob.schedule(new JobRequest.Builder(TAG), TimeUnit.HOURS.toMillis(15)+TimeUnit.MINUTES.toMillis(48)+TimeUnit.SECONDS.toMillis(5), 
TimeUnit.HOURS.toMillis(17)+TimeUnit.MINUTES.toMillis(42)+TimeUnit.SECONDS.toMillis(9));

Надеюсь это поможет.

Другие вопросы по тегам