Android 8.0 Oreo AlarmManager с широковещательным приемником и неявным запретом вещания

у меня есть критические напоминания, которые устанавливаются через Alarm Manager (он должен функционировать так же, как приложение будильника).

ранее у меня было следующее В моем Манифесте Android:

    <receiver android:name="com.example.app.AlarmReceiver" >
        <intent-filter>
            <action android:name="${packageName}.alarm.action.trigger"/>
        </intent-filter>
    </receiver>

вещательного приемника:

public class AlarmReceiver extends BroadcastReceiver {

  @Override public void onReceive(
      final Context context,
      final Intent intent) {
// WAKE LOCK
// BUILD NOTIFICATION etc...
  }

}

как установлен будильник:

final PendingIntent operation = PendingIntent.getBroadcast(
          mContext,
          requestCode,
          intent,
          PendingIntent.FLAG_CANCEL_CURRENT);

      if (PlatformUtils.hasMarshmallow()) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);

      } else {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);
      }
}

С Android 8.0 я больше не могу использовать неявную трансляцию, как определено в Манифесте. Это нормально, альтернативой является регистрация вручную, как Итак:

final BroadcastReceiver receiver = new AlarmReceiver();
final IntentFilter intentFilter = new IntentFilter(ALARM_RECEIVER_INTENT_TRIGGER);
context.registerReceiver(receiver, intentFilter);

это не кажется мне логичным.

  1. приемник сигнала тревоги будет привязан к продолжительности жизни контекста. Это вызывает проблему, когда говорят, что приложение убито из-за давления памяти или при перезапуске устройства. Мне нужно, чтобы мои сигналы тревоги срабатывали каждый раз, когда они имеют решающее значение для здоровья пользователя.

  2. даже если я слушаю "для Андроид.намерение.действие.BOOT_COMPLETED" и зарегистрируйте мой сигнал тревоги приемник приложение убивается вскоре после этого, и никакая тревога не срабатывает. Я также не вижу свою тревогу через

    АБР оболочки сигнализации иметь инструмент

как создать пользовательский широковещательный приемник, который получает неявную широковещательную передачу для запуска тревоги при таргетинге на Android O (8.0)? Может ли кто-нибудь просветить меня примером кода или ссылкой на документацию. Как работает своевременное или любое другое приложение будильника при таргетинге O?

2 ответов


слегка измените свой код, чтобы сделать трансляцию явной, а не неявной, и вы будете в порядке (предполагая this это Activity ссылка или какой-то другой Context):

Intent intent = new Intent(ALARM_RECEIVER_INTENT_TRIGGER);
intent.setClass(this, AlarmReceiver.class);

ограничение в Oreo включено подразумевается эфир Intent Регистрация, то есть вы отправляете его трансляции будет только действие, категория или данные, указанные. Вы делаете это явно broadcast, указав класс, который должен получить транслировать.


Если вы, ребята, используются, чтобы проверить, если сигнал тревоги уже был зарегистрирован, не забудьте сделать то же самое на этой проверке:

public boolean isAlarmBroadcastRegistered(Context context, String action, Class clazz) {
    Intent intent = new Intent(action);
    intent.setClass(context, clazz);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE) != null;
}