在 Android API 26 后发送本地通知

Send Local Notifications in Android API 26

我想在我的 Android 应用程序中安排简单的本地通知。

这在我定位 API 24 时工作正常,但由于我必须移动到最后一个 API 才能更新我的应用程序,因此我必须更改一些内容在我的代码中。

目前,我使用WakefulBroadcastReceiver和简单的Service发送通知。

每次我想发送通知时,我都会向我的 WakefulBroadcastReceiver 发送一个包含所有信息的 Intent,然后在 onReceive 方法中我创建一个服务并调用 startWakefulService(context, service);.

WakefulBroadcastReceiver 确保进程不会被终止,并且服务在触发通知之前在后台执行繁重的工作。

但现在有了最新 Android 版本的新 后台限制 ,我无法在我的应用程序处于后台时简单地启动服务,因此每次尝试发送通知使我的应用程序崩溃:java.lang.IllegalStateException:不允许启动服务:应用程序在后台。 我还注意到 WakefulBroadcastReceiver 现在已弃用。

设置闹钟时:

Intent broadcastIntent = new Intent(context, NotifBroadcastReceiver.class);
// ...
alarmIntent = PendingIntent.getBroadcast(context, idNotification, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
    millis, interval, alarmIntent);

收到报警时:(在NotifBroadcastReceiver中class)

// onReceive method
startWakefulService(context, service);
// the service then does the heavy job and fires the notification...

我的问题:

  1. 如何使用简单的 BroadcastReceiver(而不是 WakefulBroadcastReceiver)通过确保 CPU 在整个过程中保持清醒来发送通知?
  2. 如何更改我的代码来完成后台服务现在执行的繁重工作?

我读过 JobScheduler,但它似乎不能用在这种情况下,因为 它不能保证我会 运行时间.

通知是我的应用程序中非常重要的一部分,所以如果它们不再被触发,应用程序实际上就没用了...

我最终使用了 IntentJobService,因为它与 Pre-O 的 Service 相同,Jobs 用于 Android O。