在android中使用带闹钟管理器的广播接收器

时间:2012-04-02 02:53:06

标签: android alarmmanager android-pendingintent intentservice

为什么一般建议在使用警报管理器时传递意图服务的待处理意图?在alarmmanager调用的广播接收器的onreceive()函数中也可以做同样的事情。使用服务(Intent Service)有什么好处?

1 个答案:

答案 0 :(得分:1)

如果您需要完成的所有操作都可以在onReceive的{​​{1}}中完成,那么您应该使用它,而不是BroadcastReceiver

如果您想在IntentService后执行任何操作,则应使用BroadcastReceiver。例如,如果您希望IntentService启动BroadcastReceiver,并且您希望服务获得Service,那么您应该使用WakeLock代替IntentService

原因是AlarmManager仅保证即使您使用onReceive也会运行BroadcastReceiver的{​​{1}}。因此,如果您使用RTC_WAKEUP / BroadcastReceiver组合稍有可能,那么在Service获取Service之前CPU将处于睡眠状态 - 这是,除非您在WakeLock中获得了WakeLock,并且您可以通过BroadcastReceiver static获得服务中的一个WakeLock。但是,我认为这是......混乱。

顺便说一下,我从未实现过IntentService。我只使用BroadcastReceiverService组合,并且从未报告过任何问题。我提供的所有信息都是我从其他SO帖子(主要来自CommonsWare)读取的内容

修改

我从StackOverflow上发布的CommonsWare中读取的50ms时间框架,CommonsWare似乎是Android相当可靠的知识来源。

我查了一下,The docs说:

  

(系统允许的超时为10秒   考虑接收器被阻挡和候选人被杀死。)

他们也说:

  

如果通过标签启动此BroadcastReceiver,则该对象为no   从这个函数返回后还活着。

  1. 为了安全起见,你不应做任何接近10秒的事情。
  2. 如果你做任何必须等待回复的事情,BroadcastReceiver将会死亡,因为onReceive可能会在你收到回复之前完成运行。
  3. 尽管如此,我认为50ms时间范围的原因是你没有冒险导致ANR或任何滞后的风险。因为如果你使用Service,那么你可以开始一个新的Thread,它不会阻止。您将无法在Thread中启动新的BroadcastReceiver,因为线程后的代码将继续运行,BroadcastReceiver将会死亡,然后Thread会也死了。