Android Как установить точный повторяющийся будильник?

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

Увидев, что для Repeating Android предоставляет только сигнал тревоги Inexact с возможная задержка 75% выбранного интервала, я попытался сделать сигнал тревоги Exact, который при срабатывании снова устанавливает себя. Этот тип будильника отлично работает, пока включен мой экран. Но как только он засыпает, будильник срабатывает нормально в первый раз, но второй будильник, который установлен программно, срабатывает с задержкой, как если бы я использовал метод Inexact.

В качестве альтернативного решения я подумываю создать сигнализацию InexactRepeating, которая будет срабатывать каждую минуту, чтобы проверить, "пора ли". Таким образом, мой будильник будет с 2-минутным интервалом неточности, что приемлемо. Но я не уверен, насколько сильно он нагнетает аккумулятор телефона.

Есть идеи, ребята?

Вот моя попытка срабатывания сигнализации Exact:

AlarmManager.java

 public static void setAlarm(Context context){
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);

        //SET BROADCAST RECEIVER WHICH WILL BE THE ONE TO LISTEN FOR THE ALARM SIGNAL
        Intent intent = new Intent(context, AlarmTriggerBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 22222, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        //SETING THE ALARM
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 300000, pendingIntent);
        } else {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 300000, pendingIntent);
        } 

    }

AlarmTriggerBroadcastReceiver.java

public class AlarmTriggerBroadcastReceiver extends BroadcastReceiver {

    private final static String TAG_ALARM_TRIGGER_BROADCAST = "ALARM_TRIGGER_BROADCAST";

    @Override
    public void onReceive(Context context, Intent intent) {
        //WAKE UP DEVICE
        WakeLocker.acquire(context);

            //LAUNCH PAGE
            Intent intent1 = new Intent();
            intent1.setClassName(context.getPackageName(), SomeActivity.class.getName());
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent1);


            Toast.makeText(context, "TOAST ALARM", Toast.LENGTH_LONG).show();
        };

        //SET NEW ALARM
        AlarmManagerActivity.setAlarm(context);
        WakeLocker.release();   

    }

}

WakeLocker.java

//WAKES UP DEVICE IF PHONE'S SCREEN LOCKED
public abstract class WakeLocker {
    private static PowerManager.WakeLock wakeLock;

    public static void acquire(Context ctx) {
        //if (wakeLock != null) wakeLock.release();

        PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, "myapp:WAKE_LOCK_TAG");
        wakeLock.acquire();
    }

    public static void release() {
        if (wakeLock != null) wakeLock.release(); wakeLock = null;
    }
}

Manifest

    <uses-permission android:name = "android.permission.WAKE_LOCK" />
    <uses-permission android:name = "com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name = "android.permission.SET_ALARM"/>

  <receiver
            android:name = ".Alarm.AlarmTriggerBroadcastReceiver"
            android:process = ":remote">

            <intent-filter>
                <action android:name = "android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
            <intent-filter android:priority = "1">
                <action android:name = "my.app.here.ALARM_RECIEVED" />
            </intent-filter>
        </receiver>

Что делаете, товарищи кодировщики?

setExactWhileInIdle, в любом случае используйте push-уведомление.

notTdar 02.01.2019 13:40

@notTdar, вот что я использую. Не работает.

Oleksandr Firsov 02.01.2019 14:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
4 144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пробовали использовать WorkManager вместо широковещательных приемников? См. Подробности здесь. И демонстрация приложения здесь.

Неа. Хотя выглядит многообещающе! Собираюсь протестировать это как можно скорее, спасибо!

Oleksandr Firsov 02.01.2019 13:11

В порядке. Я провел несколько тестов с 15-минутным WorkerAlarm с 1-минутным гибким окном, и он работает как шарм. Сегодня вечером я проведу 30-минутные тесты, а затем отчитаюсь.

Oleksandr Firsov 02.01.2019 14:39

Хорошо, пожалуйста, проголосуйте за это, чтобы кто-то другой мог найти это полезным в своей работе.

Dennis Murage 02.01.2019 18:21

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