android - AlarmManager 并不总是执行 BroadcastReceiver

标签 android broadcastreceiver alarmmanager wakelock

所以我有一个 BroadcastReceiver 和 AlarmManager。

假设我像这样创建 Pending Intents:

Intent i;
i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_1);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent1 = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);

i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_2);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent2 = PendingIntent.getBroadcast(context, 2, i, PendingIntent.FLAG_UPDATE_CURRENT);

然后像这样安排闹钟:

now = SystemClock.elapsedRealtime();
long time1 = now + 10 * 1000;
long time2 = time1 + 60 * 1000;

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time1, pendingIntent1);
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time2, pendingIntent2);

我现在遇到的问题是我的广播接收器非常可靠地接收到 ACTION_1 的广播,而 ACTION_2 通常不会被传送。因此,onReceive 很少或从不以持有操作 ACTION_2 的 Intent 执行。怎么会这样?我想,*_WAKEUP 确保广播无论如何都在传送?

[2015 年 9 月 15 日更新] - 出于测试目的,我试图在我的 onReceive 方法中打印出一条日志消息。还是行不通。 - 我已经尝试在 AlarmManager 上使用 setExact。还是行不通。 - 我什至尝试过使用 WakefulBroadcastReceiver。还是行不通。 - 然而,我发现设备在电池充电状态下可以可靠地唤醒。 什么会导致这个问题? 我到处都读到,如果警报管理器通过未决 Intent 触发广播接收器,则保证执行广播接收器(并且不会做太多事情在 onReceive 中)。我的手机上是否可能有一些我无法真正反对的积极节能政策(如果没有获得长唤醒锁,请参阅评论)?

[更新 09/19/2015] 我刚刚在 Google Play 上测试了一些闹钟应用程序 ( https://play.google.com/store/apps/details?id=com.alarmclock.xtreme.free ),它也不能可靠地唤醒手机。我想,这真的是一个错误,而不是我的错。我想我会坚持使用唤醒锁解决方案。

最佳答案

我遇到了同样的问题,我找到的解决方案是仅通过操作字符串创建 Intent ,并在 list 中注册该接收器操作。尝试将 Intent 更改为这样的内容:

i = new Intent("com.app.ACTION_ONE");

然后在您的 list 文件中将以下内容添加到您的接收器:

<intent-filter>
    <action android:name="com.app.ACTION_ONE" />
</intent-filter>

我的猜测是,如果您不向接收者注册至少 1 个操作,他就会在应用程序终止时死亡。

希望它能成功,祝你好运。

关于android - AlarmManager 并不总是执行 BroadcastReceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31971669/

相关文章:

java - JSONObject 不显示在 ListView 上

javascript - 动态更改文本框焦点上的视口(viewport)会阻止显示 Android 键盘

java - 如何保存数组?

android - Android >=4.0 上的捕获媒体按钮(适用于 2.3)

java - 使用切换按钮设置警报通知 - Android

android - Android 中的提醒不会重复

android - 如何取消具有特定request_code的特定pendingIntent?

android - app :theme is now deprecated. 请改为使用 android:theme

android - 什么触发了 BluetoothDevice.ACTION_ACL 广播?

java - 关闭应用程序后,Android AlarmManager 在某些设备上不起作用