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

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

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

Я также попытался указать время прибытия, поэтому преобразовал 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();

Основное приложение

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();
    }
}

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


person Sid    schedule 11.04.2018    source источник
comment
вы пробовали для диспетчера тревог?   -  person Quick learner    schedule 11.04.2018
comment
stackoverflow.com/questions/24196890/   -  person Quick learner    schedule 11.04.2018
comment
Да, я пробовал с менеджером тревог. Но у него есть ограничения: если мобильный телефон выключается, он не вызывает будильник, а также не работает с красным ми, если приложение находится в оперативной памяти, срабатывает только будильник. Он не разрешает автоматические разрешения в Red Mi OS. Поэтому я подумал перейти на какой-нибудь другой планировщик. @способный ученик   -  person Sid    schedule 11.04.2018
comment
ну, вы должны перезапустить его, когда телефон перезагружается, это возможно   -  person Quick learner    schedule 11.04.2018
comment
но доза не работает с устройствами Red Mi. эта работа Android также не работает с Red Mi. Какой планировщик использовать? Также я заметил, что сигналы тревоги иногда пропускаются и на других устройствах. @способный ученик   -  person Sid    schedule 12.04.2018
comment
хорошо, в устройствах Redmi есть опция Autostart, пользователь должен выбрать ее вручную для каждого приложения.   -  person Quick learner    schedule 12.04.2018
comment
проблема из-за того, что приложение убивается, когда пользователь это делает?   -  person Quick learner    schedule 12.04.2018
comment
В red mi note 4 у меня не было возможности автоматически запускать разрешения. и на других устройствах может быть, когда приложение не используется, иногда не работает сигнал тревоги. @способный ученик   -  person Sid    schedule 12.04.2018
comment
для Redmi Note 4 перейдите к разрешению, затем выберите приложение автозапуска   -  person Quick learner    schedule 12.04.2018
comment
Хотите быстро проверить мой ответ? @Сид   -  person exploitr    schedule 21.09.2018


Ответы (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));

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

person exploitr    schedule 22.05.2018
comment
можно ли запланировать точное время, например. 23:59:59 ? - person Mahen; 05.10.2018
comment
Но будет ли это работать, даже если приложение не открыто? Кроме того, пользователь должен открыть приложение, чтобы запланировать задание, верно? Есть ли способ сделать это, даже если пользователь не открывает приложение? Скажем, пользователь устанавливает приложение и никогда не открывает его, но я хочу отправлять пользователю ежедневные уведомления. - person Anirudh Ganesh; 21.07.2020
comment
@AnirudhGanesh Этот ответ очень старый, раньше он хорошо работал. Кроме того, эта библиотека уже устарела. Теперь у нас есть work-manager, который выполняет задания с гарантией*. developer.android.com/topic/libraries/architecture/workmanager/ - person exploitr; 21.07.2020
comment
По крайней мере, это не устарело! Я могу его использовать. Я также использую Диспетчер работ для создания периодических запросов и однократных запросов, но опять же, для запуска работы в точное время Google по-прежнему рекомендует диспетчер аварийных сигналов и API заданий. Забавная вещь о рабочих местах Api заключается в том, что когда устройство переходит в спящий режим, я думаю, что оно не работает! Я пробовал это на разных устройствах, и для старых API все работает гладко, но в новых API приходится прибегать к чему-то другому. - person Anirudh Ganesh; 21.07.2020
comment
Да, Google сейчас очень заботится о батарее. Даже некоторые сторонние OEM-производители нарушают нормальные функции, чтобы выжать как можно меньше заряда батареи. dontkillmyapp.com - person exploitr; 22.07.2020