是否有任何理由继续使用 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 消息?的主要内容,如果未能解决你的问题,请参考以下文章

向 IntentService 询问有关其队列的信息

是否有任何理由使用一个 DataContext 实例,而不是几个?

是否有任何理由对同一资源使用“Vary: *”和“Vary: Foo”响应?

我应该使用 IntentService 还是 Service 进行 UI 更新?

是否有任何理由使用右值引用重载运算符?

是否有任何陷阱或充分的理由不使用 autosproc 进行存储过程调用?