为什么一般建议在使用警报管理器时传递意图服务的待处理意图?在alarmmanager调用的广播接收器的onreceive()函数中也可以做同样的事情。使用服务(Intent Service)有什么好处?
答案 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
。我只使用BroadcastReceiver
和Service
组合,并且从未报告过任何问题。我提供的所有信息都是我从其他SO帖子(主要来自CommonsWare)读取的内容
修改强>
我从StackOverflow上发布的CommonsWare中读取的50ms时间框架,CommonsWare似乎是Android相当可靠的知识来源。
我查了一下,The docs说:
(系统允许的超时为10秒 考虑接收器被阻挡和候选人被杀死。)
他们也说:
如果通过标签启动此BroadcastReceiver,则该对象为no 从这个函数返回后还活着。
BroadcastReceiver
将会死亡,因为onReceive
可能会在你收到回复之前完成运行。尽管如此,我认为50ms时间范围的原因是你没有冒险导致ANR或任何滞后的风险。因为如果你使用Service
,那么你可以开始一个新的Thread
,它不会阻止。您将无法在Thread
中启动新的BroadcastReceiver
,因为线程后的代码将继续运行,BroadcastReceiver
将会死亡,然后Thread
会也死了。