Я пишу свое первое приложение и пытаюсь запускать уведомление в определенное время c каждый день, в котором сообщается некоторая информация. Для начала я создал следующий класс, который я использую для перезапуска аварийных сигналов после перезагрузки и запуска аварийных сигналов из основного приложения (для этого требуется только один фрагмент кода для повторного использования).
public class SetAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
startReminderService(context);
}
public void checkServiceRunning(Context context) {
Intent reminderIntent = new Intent(context, AlarmReceiver.class);
reminderIntent.setAction("MyReminder");
// I check if a reminder is already active
boolean reminderActive = (PendingIntent.getBroadcast(context, REMINDER_SERVICE,
reminderIntent,
PendingIntent.FLAG_NO_CREATE) != null);
Log.d("test", "The reminder is active?" + reminderActive);
if (!reminderActive) {
startReminderService(context);
}
}
public void startReminderService(Context context) {
Calendar serviceNotificationTime = Calendar.getInstance();
serviceNotificationTime.set(Calendar.HOUR_OF_DAY, 9);
serviceNotificationTime.set(Calendar.MINUTE, 0);
serviceNotificationTime.set(Calendar.SECOND, 0);
Intent reminderIntent = new Intent(context, AlarmReceiver.class);
reminderIntent.setAction("MyReminder");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
REMINDER_SERVICE,
reminderIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager serviceAlarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
serviceAlarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
serviceNotificationTime.getTimeInMillis(),
AlarmManager.INTERVAL_DAY,
pendingIntent);
if (pendingIntent != null) {
Log.d("test", "Background service set up and running.");
} else {
Log.d("test", "Failed to set up background service!");
}
}
}
После что я обновил манифест следующими строками:
<receiver
android:name="com.mycompany.myapp.services.SetAlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name="com.mycompany.myapp.services.AlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="MyReminder" />
</intent-filter>
</receiver>
Пока все идет хорошо. Когда телефон перезагружается, напоминание корректно перезапускается и (если время напоминания прошло) сразу срабатывает.
Класс AlarmReceiver следующий:
public class AlarmReceiver extends BroadcastReceiver {
private Context ctx;
@Override
public void onReceive(Context context, Intent intent) {
this.ctx = context;
remindStuff();
}
private void remindStuff() {
....
some code
....
// I check if the alarm is still on (probably awful, since it just fired)
SetAlarmReceiver setAlarmReceiver = new SetAlarmReceiver();
setAlarmReceiver.checkServiceRunning(ctx);
}
}
Я использую Тот же подход, чтобы проверить, включен ли сигнал тревоги из основного действия:
private void checkServicesRunning() {
SetAlarmReceiver setAlarmReceiver = new SetAlarmReceiver();
setAlarmReceiver.checkServiceRunning(getApplicationContext());
}
Все выглядит правильно для меня, я пробовал любое решение, которое нашел, читая тонны вопросов, подобных моему, в StackOverflow, но я все еще могу не понимаю, что я делаю не так. Тревога срабатывает правильно сразу после того, как система активирует BOOT_COMPLETED, и срабатывает правильно, когда я только что включил тревогу (только если время уведомления уже прошло - например, когда 10 вечера, а тревога должна сработать в 9 утра). Когда метод checkServiceRunning запускается, он говорит мне, что сигнал тревоги уже включен (возвращая true в Logcat), но когда я закрываю приложение и через некоторое время перезапускаю его, сигнал тревоги выглядит так, как будто он был отменен, и он воссоздается приложение.
Есть подсказка?
Спасибо.
РЕДАКТИРОВАТЬ: Я попробовал команду 'adb shell dumpsys alarm', и она фактически показывает мой сигнал тревоги. работает правильно, поэтому, на данный момент, я думаю, что проблема в другом, но я не могу понять, что ...