我使用Alarm Manager每5分钟获取一次触发器。
警报接收器扩展WakefulBroadcastReceiver
并在接收警报触发器时通过startWakefulService(context,service)
启动IntentService。在服务中接收onHandleIntent(Intent intent)
方法中的意图后,应用程序会执行一些所需的操作,并在此方法结束时通过调用AlarmReceiver.completeWakefulIntent(intent)
来释放唤醒锁。
我的应用程序运行正常但在logcat中我看到了WakefulBroadcastReceiver
的警告消息。
Tag: WakefulBroadcastReceiver Warning message: No active wake lock id #1
每次触发时都会出现这些警告消息,#number
每次都会增加。
我想知道应用程序设置的警报是否存在问题,因为消息的数量逐渐增加。或者仅仅因为警报管理器没有创建wale-lock,我的应用程序正试图通过completeWakefulIntent
将其删除。
答案 0 :(得分:3)
很可能startWakefulService
和onHandleIntent
在不同的进程中执行。在这种情况下,调用静态AlarmReceiver.completeWakefulIntent
将表现得好像它起作用,但由于在该进程空间中找不到实际的唤醒锁定,您将收到该警告消息。
答案 1 :(得分:1)
确保您在Android清单中正确输入了WAKE_LOCK权限。如果您忘记或错误输入了它,那么startWakefulService将启动该服务,但之后会无声地失败。您不会在日志cat中看到任何突出显示问题的明显内容。
就我而言,Android Studio已自动完成'WAKE_LOCK'作为小写'wake_lock'。该服务确实启动了,但startWakefulService从未完全返回,我通过日志验证。某种例外情况正在加剧。
public class FooBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Fpp receiver fired. Starting bar service");
Intent serviceIntent = new Intent(context, BarService.class);
startWakefulService(context, serviceIntent);
Log.d(TAG, "Started bar service"); // << never reached!
}
每当BarService调用completeWakefulIntent时,我遇到问题的主要指示是“没有活动唤醒锁定ID”消息显示在日志中。
最后,我的麻烦都发生在代码在同一物理过程中执行,所以第一个答案不适用。
注意:我的体验是运行Kitkat 4.4.2的三星Galaxy Note 10。