gpt4 book ai didi

当应用程序处于打瞌睡模式时,由警报管理器触发的 Android 通知不会触发

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:34:43 26 4
gpt4 key购买 nike

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

这是我希望我最终不会提交的问题之一,因为在编写它时推荐了类似的问题。然而,一些团队成员花了数小时和数小时查看 Android 开发人员文档和 Stackoverflow,我们似乎离答案还很近,所以我们来了。

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

我怀疑这可能是 Android P 中引入的节电、唤醒锁等更改引起的问题,因为在将我们的目标 SDK 更新到 28 之前我们没有遇到这个问题。话虽如此,我并不肯定这是唯一的问题,但我可以在运行 Android P 的 Pixel 和 Pixel 3 XL 上始终如一地重现该问题。

例如,当用户将提醒设置为半夜的某个时间(大概是在用户睡着了,因此几个小时内不会使用手机)时,会发生通知未触发的示例。这些提醒永远不会触发。

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

这个问题似乎与另一个使用 Alarm Manager's setRepeating 的问题类似我们发现的方法不起作用。我们改为使用警报管理器的 setExactAndAllowWhileIdle 方法。我们还通过警报管理器尝试了相同的实现 setAlarmClock根据 Android 文档“即使系统处于低功耗空闲(又名打瞌睡)模式也将允许触发”的方法,但这也不成功。

我怀疑这不起作用的原因是当手机处于打瞌睡模式时 setExactAndAllowWhileIdle 不会触发,类似于 this question 中表达的问题. This question recommends using Firebase JobDispatcher 但由于这是一个内部通知,我需要在有或没有网络连接的情况下触发通知,这似乎消除了 Firebase JobDispatcher 作为一个选项。这个问题还表明,一旦手机退出打瞌睡模式,用户就会收到通知,但我们永远不会收到通知,他们似乎因为找不到更好的术语而迷路了。

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

<uses-permission android:name="android.permission.WAKE_LOCK" />

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

<receiver android:name="com.myapp.receiver.AlarmReceiver">
</receiver>

这是我当前的实现:

处理通知的待处理 Intent

Intent i = new Intent(context, ScheduleAllReceiver.class);
PendingIntent scheduleAllPendingIntent = PendingIntent.getBroadcast(context, SCHEDULER_DAILY_ALL, i, PendingIntent.FLAG_UPDATE_CURRENT);

我随后调用了一个方法“createAlarm”,如下所示

createAlarm(context, scheduleAllPendingIntent, calendar.getTimeInMillis());

创建警报

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);
}
}
}

最佳答案

添加 Intent 标志FLAG_RECEIVER_FOREGROUND

https://developer.android.com/reference/android/content/Intent#FLAG_RECEIVER_FOREGROUND在调用广播接收器之前应该做这个技巧

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);

关于当应用程序处于打瞌睡模式时,由警报管理器触发的 Android 通知不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55540823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com