AlarmManager отменяется через некоторое время - PullRequest
2 голосов
/ 25 января 2020

Я пишу свое первое приложение и пытаюсь запускать уведомление в определенное время 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', и она фактически показывает мой сигнал тревоги. работает правильно, поэтому, на данный момент, я думаю, что проблема в другом, но я не могу понять, что ...

...