苦苦挣扎的程序员,
我已经查阅了有关c2dm的所有文档,但仍在寻找一些建议。我是否需要在应用程序中实施服务以侦听Google服务器将其推送到设备时创建的Intent?
http://android-developers.blogspot.com/2010/05/android-cloud-to-device-messaging.html
https://developers.google.com/android/c2dm/
该文档指出,当收到Intent时,它会通过在应用清单中拥有正确的Intent过滤器和权限来唤醒应用程序。但是当应用程序甚至没有加载到内存中时,这怎么可能呢?操作系统如何知道去哪里?
在我看来,我需要拥有具有这些权限的后台服务,然后在收到通知后启动我的应用。
任何人都对这个想法有所了解吗?
也许是使用c2dm实现后台服务的人
或发现它不需要。
答案 0 :(得分:2)
Intent过滤器不需要启动应用程序或服务。当操作系统发现您已经注册了Intent过滤器的事件时,它将启动Intent过滤器所附加的Intent,如清单中所示。
答案 1 :(得分:0)
通常,您不需要服务。这取决于您对消息需要什么样的反应。如果你想开始一项活动 - 可以直接从C2DM消息接收器那里开始。
顺便说一句,C2DM意图不是服务意图。他们是接收者意图。即使它想要,服务也无法捕获它们。在API级别,您无法触发意图本身 - 您有startActivity()
,start/bindService()
或sendBroadcast()
。根据所调用的API,系统将根据活动,服务或接收器匹配意图。
我已经实施了C2DM。在我的情况下,我确实有一个服务 - 但这只是因为我的应用程序中对C2DM消息的反应是一个无UI的HTTP请求可能需要一些时间。这似乎是宏观方案中相当常见的模式 - C2DM只是一个触发器,它只告诉应用程序新数据在后端等待。在这种情况下,服务将悄悄地查询后端以获取所述新数据并处理它们。那是我的情况。但它不一定是这样的。
单独的接收器不是HTTP的好工具,因为接收器对象是瞬态的 - 一旦传递意图,Android就会认为接收器完成并丢弃它。在此之后,应用程序的进程没有运行对象,并且可以随时关闭。另一方面,服务一旦启动就会运行,直到明确完成(stopService()
被调用)。这告诉Android应用程序正在做某事,请不要终止。正在运行的服务并不能确保在内存不足的情况下应用程序不会被关闭,但它总比没有好。
从技术上讲,即使运行的唯一内容是广播接收器,您的应用也在运行。当C2DM消息到达时,Android将启动应用程序(进程,而不是主要活动)。除非你刷一些UI,否则用户不会知道。这取决于您从接收器调用应用程序的其他组件。