应用程序处于打ze模式时,警报管理器触发的Android通知未触发

pat*_*719 5 notifications android alarmmanager android-doze android-9.0-pie

我有以下要求。用户需要能够在我的应用中安排定期提醒,该提醒将在每天的确切时间触发推送通知。

这是我希望最终不要提交的那些问题之一,因为在编写它时建议您提出类似的问题。但是,几个团队成员花了很多时间来查看Android Developer Docs和Stackoverflow,我们似乎离答案还很近,所以我们到了。

如果我创建了一个提醒并将其设置为在未来5分钟触发通知,则该通知会正常触发。

我怀疑这可能是由于Android P中引入的节电,唤醒锁等更改引起的问题,因为在将目标SDK更新到28之前我们没有这个问题。唯一的问题,但我可以在运行Android P的Pixel和Pixel 3 XL上一贯重现该问题。

例如,当用户将提醒设置为半夜的某个时间(大概是在用户处于睡眠状态,因此将有几个小时没有使用电话)时,便会发生通知未触发的示例。这些提醒从未触发过。

我目前正在尝试使用“警报管理器”来完成此操作。

该问题似乎类似于另一个问题,该问题使用了警报管理器的setRepeating方法,但我们发现该方法不起作用。相反,我们使用警报管理器的setExactAndAllowWhileIdle方法。我们还使用Alarm Managers setAlarmClock方法尝试了相同的实现,根据Android文档,该方法“即使系统处于低功率空闲(也称为打ze)模式,也将被允许触发”,但这也没有成功。

我怀疑这不起作用的原因是因为在电话处于打ze模式时setExactAndAllowWhileIdle不会触发,类似于此问题中表达的问题。此问题建议使用Firebase JobDispatcher,但由于这是内部通知,因此无论是否具有网络连接,我都需要触发该通知,这似乎消除了Firebase JobDispatcher的选择。这个问题还表明,一旦手机退出打ze模式,用户会收到通知,但我们从未收到通知,他们似乎因为缺少更好的条件而迷路了。

我已将唤醒锁定权限添加到我的AndroidManifest.xml中:

<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)

这是我的接收者在AndroidManifest.xml中的注册方式

<receiver android:name="com.myapp.receiver.AlarmReceiver">
    </receiver>
Run Code Online (Sandbox Code Playgroud)

这是我当前的实现:

待处理通知的意图

Intent i = new Intent(context, ScheduleAllReceiver.class);
    PendingIntent scheduleAllPendingIntent = PendingIntent.getBroadcast(context, SCHEDULER_DAILY_ALL, i, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

我随后将方法称为“ createAlarm”,如下所示

createAlarm(context, scheduleAllPendingIntent, calendar.getTimeInMillis());
Run Code Online (Sandbox Code Playgroud)

创建警报

public static void createAlarm(Context context, PendingIntent pendingIntent, long timeinMilli) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    if(alarmManager != null) {

        if (Build.VERSION.SDK_INT >= 23) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeinMilli, pendingIntent);
        } else {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeinMilli, pendingIntent);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

Adding an intent Flag FLAG_RECEIVER_FOREGROUND

https://developer.android.com/reference/android/content/Intent#FLAG_RECEIVER_FOREGROUND prior to calling the broadcast receiver should do the trick

Intent intent = new Intent(context, ScheduleAllReceiver.class);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
PendingIntent scheduleAllPendingIntent = PendingIntent.getBroadcast(context, SCHEDULER_DAILY_ALL, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

  • 您能否添加任何解释为什么它有效以及为什么我们应该添加它? (3认同)