相关疑难解决方法(0)

带有广播接收器和隐式广播禁令的Android 8.0 Oreo AlarmManager

我有通过报警管理器设置的关键提醒(它的功能与闹钟应用程序相同).

以前我的Android Manifest中有以下内容:

    <receiver android:name="com.example.app.AlarmReceiver" >
        <intent-filter>
            <action android:name="${packageName}.alarm.action.trigger"/>
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

广播接收器:

public class AlarmReceiver extends BroadcastReceiver {

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

}
Run Code Online (Sandbox Code Playgroud)

如何设置警报:

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);
      }
}
Run Code Online (Sandbox Code Playgroud)

使用Android 8.0,我不能再使用Manifest中定义的隐式广播.那很好,给出的替代方法是手动注册它,如下所示:

final BroadcastReceiver receiver = new AlarmReceiver();
final IntentFilter intentFilter = new IntentFilter(ALARM_RECEIVER_INTENT_TRIGGER);
context.registerReceiver(receiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不合逻辑.

  1. 警报接收器将与上下文的生命周期相关联.当由于内存压力或设备重启而导致应用程序被杀死时,这会导致问题.我每次都需要触发警报,因为它们对用户的健康至关重要. …

android broadcastreceiver android-broadcast

14
推荐指数
1
解决办法
1万
查看次数