是否有任何理由继续使用 IntentService 处理 GCM 消息?
Posted
技术标签:
【中文标题】是否有任何理由继续使用 IntentService 处理 GCM 消息?【英文标题】:Is there any reason to continue using IntentService for handling GCM messages? 【发布时间】:2013-08-24 00:09:24 【问题描述】:如您所知,最近 Google 更改了他们的 GCM 文档,并声称不再需要 IntentService
来处理到达的 GCM 消息。所有的处理都可以在BroadcastReceiver
中完成。
当试图弄清楚是否有任何充分的理由继续使用IntentService
时,我遇到了这个quote:
WakefulBroadcastReceiver 向其传递处理 GCM 消息的工作的服务(通常是 IntentService),同时确保设备在此过程中不会重新进入睡眠状态。 包含 IntentService 是可选的——您可以选择在常规 BroadcastReceiver 中处理您的消息,但实际上,大多数应用都会使用 IntentService。
为什么大多数应用会使用IntentService
?是否存在无法直接在BroadcastReceiver
中处理 GCM 消息的情况?
【问题讨论】:
【参考方案1】:为什么大多数应用会使用 IntentService?
因为您响应消息所做的任何事情很可能需要 1-2 毫秒以上的时间,这意味着您希望从主应用程序线程中完成这项工作。响应广播的常见模式是将工作委托给IntentService
。
因此,如果您响应 GCM 消息的工作涉及:
磁盘 I/O 进一步的网络 I/O(例如,从您的 Web 服务中检索其他数据) 大量计算(例如图像处理)您可能希望使用IntentService
来执行该工作。
【讨论】:
感谢您的回答!因此,如果我理解正确,如果对 GCM 消息的响应仅涉及显示通知,则没有理由使用 IntentService。我说的对吗? @Eran:这可能是安全的,假设您没有将磁盘 I/O 作为显示Notification
的一部分(例如,读取一些数据库信息以填充 Notification
内容) .
@CommonsWare 承诺将共享首选项视为 I/O?
@OfekRon:是的,不过请注意apply()
为 I/O 分叉了自己的后台线程。 commit()
是同步的,理想情况下不在主应用程序线程上完成。同样,如果您的请求是此过程中第一次请求它并且必须从磁盘读取首选项,则尝试获取 SharedPreferences
对象(例如,PreferenceManager.getDefaultSharedPreferences()
)可能会执行磁盘 I/O。
@CommonsWare 你好,我的应用程序在前台运行时可以通过 Pending Intent(不是 GCM 通知)推送本地通知,但在后台运行时无法推送通知(onPause
),android 系统限制吗?我需要Intent Service
来推送本地通知吗?以上是关于是否有任何理由继续使用 IntentService 处理 GCM 消息?的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何理由使用一个 DataContext 实例,而不是几个?
是否有任何理由对同一资源使用“Vary: *”和“Vary: Foo”响应?