Android: BroadcastReceiver не будет слушать BOOT_COMPLETED - PullRequest
1 голос
/ 04 ноября 2019

Мое приложение отправляет ежедневное уведомление (это работает правильно), но после перезагрузки устройства уведомление не запускается снова.

Я пытаюсь установить BroadcastReceiver, который слушает BOOT_COMPLETED, но безрезультатно.

AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
...
<receiver android:name=".helpers.notification.AlarmRebootReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

BroadcastReceiver:

public class AlarmRebootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context oContext, Intent intent) {

        try {    
            Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
            notificationIntent.addCategory("android.intent.category.DEFAULT");

            String notificationMessage = TMLocale.getStringResourceByName("reminder_newthought");
            String notificationTitle = TMLocale.getStringResourceByName("app_name");

            TMNotification.Notify(notificationTitle, notificationMessage, Enum.ArtAndWordsNotification.NEWTHOUGHT, oContext);

            TMNotification.cancelNewThoughtAlarm(oContext);
            scheduleNewThoughtAlarm(oContext);
        } catch (Exception e) {
            ExceptionHandler.logException(e);
        }
    }

    private void scheduleNewThoughtAlarm(Context oContext) {

        Calendar cal = Calendar.getInstance();
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int month = cal.get(Calendar.MONTH);
        int year = cal.get(Calendar.YEAR);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minutes = cal.get(Calendar.MINUTE) + 1;
        int seconds = cal.get(Calendar.SECOND);

        Calendar newCalendar = TMDate.generateCalendar(day, month, year, hour, minutes, seconds);
        TMNotification.scheduleNewThoughtAlarm(oContext, newCalendar, null);
    }
}

Я установил загрузочный приемник включенным в false в AndroidManifest и установил его в true по коду при создании тревоги, как это предлагается в официальных документах (это так, что вы слушаете загрузку завершено только при необходимости).

Где запускается уведомление:

private static void doNewThoughtSchedule(Context oContext, int reminderPreference, boolean randomNotificationsPreference,
                                             Calendar calendar, Intent notificationIntent){

    ComponentName receiver = new ComponentName(ApplicationContext.get(), AlarmRebootReceiver.class);
    PackageManager pm = ApplicationContext.get().getPackageManager();

    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);

    ...
}

В коде все нормально, но перезагрузка устройствабольше не будет отправлять уведомления.

Пробовал на устройстве Huawei Android 9, а также на старом телефоне Android 4.4. Никто не работал.

Любая помощь?

PS. Метод TMNotification.scheduleNewThoughtAlarm не имеет значения, поскольку он работает нормально (установка простого тоста даже не будет отображаться в onReceive).

PS2. Это странно, но точно следование официальным документам здесь не приводит к искажению: https://developer.android.com/training/scheduling/alarms.html#java (где заголовок «Запустить сигнал при перезагрузке устройства»).

1 Ответ

0 голосов
/ 04 ноября 2019

Может быть ограничение при настройке нескольких intent-filer action. Поэтому измените свое определение на следующее.

<!-- Don't forget about permission -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>


<!-- ... -->
<receiver android:name=".helpers.notification.AlarmRebootReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
</receiver>

Для всех остальных фильтров намерений используйте отдельный Receiver. Теперь вы можете получать события в вашем методе. Просто распечатайте журналы, чтобы убедиться, что наступит время. И несколько устройств для проверки, это не специфическое устройство.

public class AlarmRebootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context oContext, Intent intent) {
           Log.d("", "Event Received");
           /**
            * .....
            **/
    }
}
...