【发布时间】:2012-04-02 02:53:05
【问题描述】:
为什么在使用警报管理器时通常建议为 Intent Service 传递待处理的 Intent?同样的事情可以在报警管理器调用的广播接收器的 onreceive() 函数中完成。使用服务(意图服务)有什么好处?
【问题讨论】:
标签: android alarmmanager android-pendingintent intentservice
为什么在使用警报管理器时通常建议为 Intent Service 传递待处理的 Intent?同样的事情可以在报警管理器调用的广播接收器的 onreceive() 函数中完成。使用服务(意图服务)有什么好处?
【问题讨论】:
标签: android alarmmanager android-pendingintent intentservice
如果您需要完成的所有事情都可以在onReceive 或BroadcastReceiver 中完成,那么您应该使用它,而不是IntentService。
如果你想在BroadcastReceiver 之后做任何事情,那么你应该使用IntentService。例如,如果您希望 BroadcastReceiver 启动 Service,并且希望服务获得 WakeLock,那么您应该改用 IntentService。
原因是AlarmManager 只保证BroadcastReceiver 的onReceive 将被运行,即使您使用RTC_WAKEUP。因此,如果您使用 BroadcastReceiver/Service 组合,那么 CPU 将在 Service 获取 WakeLock 之前进入休眠状态 - 除非您在 WakeLock 中获取BroadcastReceiver 并且您在服务中获得了一个,也许是通过static WakeLock。但我想这……有点乱。
顺便说一句,我从未实现过IntentService。我只是使用BroadcastReceiver 和Service 组合并且从未报告过问题。我提供的所有信息都是我从其他 SO 帖子(主要来自 CommonsWare)中阅读的内容
编辑:
我从 CommonsWare 在 StackOverflow 上发布的内容中读到了 50 毫秒的时间框架,而 CommonsWare 似乎是一个相当可靠的 Android 知识来源。
我查了一下,The docs 说:
(之前系统允许的超时时间为 10 秒 考虑到接收者被阻塞并且候选人被杀死)。
他们还说:
如果此 BroadcastReceiver 是通过标签启动的,则该对象是 no 从这个函数返回后更长寿。
BroadcastReceiver 将会死掉,因为 onReceive 可能会在您收到响应之前完成运行。不过,我认为 50 毫秒时间范围的原因是为了避免导致 ANR 或任何延迟的风险。因为如果你使用Service,那么你可以启动一个新的Thread,它不会阻塞。您将无法在BroadcastReceiver 中启动新的Thread,因为线程之后的代码会继续运行,BroadcastReceiver 会死掉,然后Thread 也会死掉。
【讨论】:
Service,因为BroadcastReceivers 是短暂的。因此,对于从服务器进行轮询、发送文本消息并检查其状态或播放音频之类的事情,您需要Service。
Service。不过,不要低估代码运行的速度。如果您有很多代码,请在onReceive 的顶部放置一个Log.i(tag, "beginning),然后在onReceive. Compare the times via the Logcat. If the difference in time is < 50ms, then use the BroadcastReceiver. If you use any code that requires your app to wait for any amount of time, just use a Service 的末尾放置一个“结束”Log