Я создаю приложение для будильника, которое будет иметь точный повторяющийся будильник.
Увидев, что для 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>
Что делаете, товарищи кодировщики?
@notTdar, вот что я использую. Не работает.




Вы пробовали использовать WorkManager вместо широковещательных приемников? См. Подробности здесь. И демонстрация приложения здесь.
Неа. Хотя выглядит многообещающе! Собираюсь протестировать это как можно скорее, спасибо!
В порядке. Я провел несколько тестов с 15-минутным WorkerAlarm с 1-минутным гибким окном, и он работает как шарм. Сегодня вечером я проведу 30-минутные тесты, а затем отчитаюсь.
Хорошо, пожалуйста, проголосуйте за это, чтобы кто-то другой мог найти это полезным в своей работе.
setExactWhileInIdle, в любом случае используйте push-уведомление.