AlarmManager是否要求PendingIntent属于BroadcastReceiver类型?

时间:2014-09-15 16:08:34

标签: android broadcastreceiver alarmmanager android-pendingintent intentservice

AlarmManager的文档似乎暗示(但并非明确要求)您传递给任何set()方法的PendingIntent应为{{3}类型但是,我测试了传入其他组件类型(如BroadcastReceiver),它似乎工作正常。

IntentService使用非BroadcastReceiver意图是否安全?

1 个答案:

答案 0 :(得分:8)

是的,它一直有效,但我怀疑不是你想的那样。您可以将任何PendingIntent与警报一起使用;这可能确实是一项活动或服务PendingIntent。如果它是服务PendingIntent,那么操作系统将在警报触发时为您调用startService()。隐藏的捕获是关于唤醒警报的行为。

当任何警报触发时,只要发送PendingIntent,操作系统就代表发送者持有唤醒锁,此时释放唤醒锁并允许设备返回休眠状态。 “只要需要交付”的确切含义取决于使用哪种PendingIntent。

广播传送基本上被视为同步:唤醒管理器保持唤醒锁,直到收件人的onReceive()回调返回。这使您很难保证在onReceive()中要执行的任何处理都能保证在设备无法休眠的情况下继续进行。

但是,活动和服务PendingIntent传递不会以相同的方式等待收件人。通过这些类型的警报PendingIntents,设备保持清醒足够长的时间来开始启动目标活动或服务的过程,但是然后它可以(并且确实)在启动开始后立即恢复睡眠状态,在目标代码实际有机会运行之前。在实践中,这意味着对于服务PendingIntent,即使警报是唤醒警报,该服务通常也不会实际执行,直到整个设备被正常唤醒,例如,下次用户手动打开屏幕时。

有时这是可以的,如果您的代码实际上并不关心,即使闹钟在凌晨3点开始,该服务也没有开始运行,直到早上7点钟闹钟响起并长时间点亮手机。但更常见的是,应用程序需要做的是使用广播警报,然后在他们的onReceive()中 - 知道设备一返回就会睡觉 - 获取他们的自己的唤醒锁并开始在那个唤醒锁等下的服务

有一个名为WakefulBroadcastReceiver的极好的支持库类,它封装了这种警报唤醒式服务舞蹈,使其既简单又防弹;它是https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html。如果您想要启动服务以响应唤醒警报,请使用它。