所以我有一个 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/