0

苦苦挣扎的程序员们,

我已经查阅了有关 c2dm 的所有文档,但仍在寻找一些建议。我是否需要在我的应用程序中实现一个服务来监听谷歌服务器将它们推送到设备时创建的意图?

http://android-developers.blogspot.com/2010/05/android-cloud-to-device-messaging.html

https://developers.google.com/android/c2dm/

文档说明它会在收到 Intent 时通过在应用程序清单中具有正确的 Intent 过滤器和权限来唤醒应用程序。但是,当应用程序甚至没有加载到内存中时,这怎么可能呢?操作系统如何知道要去哪里?

在我看来,我需要一个具有这些权限的后台服务,然后在收到通知时启动我的应用程序。

有人对这个想法有一些见解吗?

也许有人使用 c2dm 实现了后台服务

或发现它是不需要的。

4

2 回答 2

2

意图过滤器不需要启动应用程序或服务。当操作系统看到您已为其注册 Intent 过滤器的事件发生时,它将启动 Intent 过滤器附加到的 Intent,如清单中所示。

于 2012-06-12T14:21:49.880 回答
0

一般来说,您不需要服务。这取决于您需要对消息做出什么样的反应。如果您想开始一项活动 - 可以直接从 C2DM 消息接收器开始。

顺便说一句,C2DM 意图不是服务意图。它们是接收者意图。服务即使想要也无法捕获它们。在 API 级别上,您本身不能触发意图- 您有 call startActivity()、 or start/bindService()、 or sendBroadcast()。根据调用的 API,系统会将意图与活动、服务或接收者进行匹配。

我已经实现了 C2DM。就我而言,我确实有一项服务——但这只是因为我的应用程序中对 C2DM 消息的反应是一个无 UI 的 HTTP 请求,可能需要一些时间。这似乎是宏观方案中相当常见的模式——C2DM 只是一个触发器,它只告诉应用程序新数据在后端等待。在这种情况下,服务会悄悄地向后端查询所述新数据并进行处理。这就是我的情况。但它不必是这种方式。

单独的接收器不是 HTTP 的好工具,因为接收器对象是瞬态的——一旦传递了一个意图,Android 就会假定接收器完成并丢弃它。在此之后,应用程序的进程没有运行对象,并且随时可能关闭。另一方面,服务一旦启动,就会一直运行,直到明确完成(stopService()被调用)。这告诉 Android 应用程序正在做某事,请不要终止。正在运行的服务并不能保证应用程序在内存不足的情况下不会关闭,但总比没有好。

从技术上讲,即使唯一运行的是广播接收器,您的应用程序也在运行。当 C2DM 消息到达时,Android 将启动应用程序(进程,而不是主要活动)。除非您刷新一些 UI,否则用户不会知道。从接收器调用应用程序的哪些其他组件取决于您。

于 2012-06-12T14:36:07.563 回答