У меня есть диспетчер аварийной сигнализации. Он должен работать один раз в день. И будильник должен существовать, если я удаляю приложение из задачи или перезагружаю устройство. Но когда я перезагружаю устройство, тревоги не существует. Если я удалю приложение из задачи, будильник тоже не существует.AlarmManager не работает
MainActivity:
@Override
protected void onResume() {
if (isAlarmEnableded) {
if (!isAlarmSheduled) {
setAlarm();
isAlarmSheduled = true;
putInSharedPreferences(Boolean.toString(isAlarmSheduled));
}
} else {
cancelAlarm(MainActivity.this);
isAlarmSheduled = false;
putInSharedPreferences(isAlarmSheduled);
}
super.onResume();
}
isAlarmEnableded
- SwitchPreference = верно. Если isAlarmEnableded
- я выключаю будильник. isAlarmSheduled
- значение, которое я сохраняю в настройках. Он отображает состояние аварийного сигнала
private void setAlarm() {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction(Constants.ALARM_INTENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
Constants.PENDINGINTENT_REQUEST_CODE, intent, 0);
if (android.os.Build.VERSION.SDK_INT >= 19) {
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, setAlarmTime(),
AlarmManager.INTERVAL_DAY, pendingIntent);
} else {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setAlarmTime(),
AlarmManager.INTERVAL_DAY, pendingIntent);
}
private long setAlarmTime() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 48);
calendar.set(Calendar.SECOND, 0);
if (System.currentTimeMillis() > calendar.getTimeInMillis()) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
return calendar.getTimeInMillis();
}
Если текущее время> это время, я установил будильник на завтра.
Constants.ALARM_INTENT
- "com.blabla.AlarmReceiver".
AlarmReceiver
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
NotificationActivity показывает диалог во время тревоги. Также у меня есть DeviceBootReceiver, который вызывает метод setAlarm()
и ставит isAlarmScheduled
в настройках. Manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name="com.mypackage..AlarmReceiver">
<intent-filter>
<action android:name="com.blabla.AlarmReceiver" />
</intent-filter>
</receiver>
<receiver
android:name="com.mypackage.DeviceBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Я проверяю сигналы тревоги по adb shell dumpsys alarm > dump.txt
. Мне нужен стабильный сигнал тревоги, который работает один раз в день во всех случаях. Если я выключил приложение и перезапустил его, то будильник должен быть таким же. Тревога срабатывает во всех случаях, но не при перезагрузке устройства и при удалении приложения из задачи. Maby мой код содержит некоторые ошибки. Помогите мне решить мою проблему, потому что я не знаю, что я делаю неправильно/Спасибо
Я знаю. Мой приемник выглядит так, как вы его описываете. Он вызывает метод setAlarm() и ставит isAlarmScheduled в настройках. Но это не работает – Jackky777
Что касается класса com.mypackage.DeviceBootReceiver, можете ли вы отправить файл класса –
protected void onResume() {setAlarm(); isAlarmSheduled = true; putInSharedPreferences (Boolean.toString (isAlarmSheduled));} – Jackky777