查看: 8545|回复: 23

【有奖问答】Android应用如何解决消息推送的问题

[复制链接]
认证徽章
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2012-10-18 01:39 | 显示全部楼层 |阅读模式
本帖最后由 jieforest 于 2012-11-12 16:41 编辑

【需求】开发一个Android应用程序,每天服务器会向安装了该应用程序的Android设备发送上百条信息,Android设备也会主动发送信息到服务器端,与服务器交互(比如向服务器报告位置等)。

【问题】
1. 如何设计程序架构,以便能够满足以上需求?
2. 如何让解决方案最高效?

说明:解决方案不是唯一的,可以采用的技术也很多,欢迎大家踊跃讨论。话题请围绕消息推送这个需求展开。

【活动时间】2012-10-18——2012-11-8

【活动奖励】针对以上任意一个问题跟帖回答,我们会在讨论结束后,随机抽选讨论最积极的4名网友赠送《Android进阶实战》这本书作为奖励。

【图示信息】
QQ截图20121018094117.png

作     者:蔺华,时允田 著                                                            
出 版 社: 电子工业出版社
ISBN:9787121179938

《Android进阶实践》内容结构新颖、知识点比较全面,讲解详细,重点难点突出实用,全书分4部分,第1部分是Android入门知识与环境搭建,讲解了Android基本知识、版本介绍,以及与其他平台的比较和环境的安装与搭建。第2部分是项目挑战篇,主要讲解由常用Android技术知识点实现的项目应用,让读者在愉悦的项目开发过程中学习知识点。第3部分是综合应用项目篇,主要通过外来插件调用实现具体功能,让读者充分利用外部资源实现更加强大的功能,便于读者进行思维扩展和提高学习技巧。第4部分通过介绍Android的一些企业项目和个人项目为学习者提供学习和开发思路。




————————————————
本期活动获奖会员为:

chszs
duhouchen
jief
kinghq


注:打酱油的、讨论不够积极的没有奖励哦!
论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
发表于 2012-10-18 10:26 | 显示全部楼层
本帖最后由 chszs 于 2012-10-18 19:37 编辑

从服务器获取不定时更新的信息一般来说有两种方法:

第一种是客户端使用Pull(拉)的方式,每隔一段时间就访问一次服务器,查看服务器上是否有更新的信息,如果有,就获取信息。

第二种就是服务器使用Push(推送)的方式,只要服务器端有了新信息,就把最新的信息推送到客户端上。

推和拉两种方式都能实现获取服务器端更新信息的功能,但是很显然,推方式对客户端更有利,因为拉方式比较耗网络流量,尤其是对于我们的智能手机,拉方式每隔一段时间就在后台通过服务悄悄访问服务器,既消耗了内存,又占用了网络流量,还浪费了不少电量。

所以,开发Android应用程序实现信息推送,最好是采用推方式。

在Android 2.x时代,Google提供了C2DM(Cloud to Device Messaging)服务,帮助开发者实现推方式。

C2DM是用于帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

对于国内的开发者来说,C2DM有一个致命的缺点。因为C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这很麻烦。

在Android 4.x时代,也就是今年,Google发布了Google Cloud Messaging for Android,该服务对已被废弃的云到端消息框架(C2DM)做出改进,取而代之的服务无配额限制、无需注册,并提供了一套更丰富的全新接口。

GCM提供了在应用服务器和Android设备之间引入代理的能力,以保障两者之间可伸缩的云通信。GCM定义了契约,应用服务器和Android应用都注册GCM服务,Google GCM服务器维护两者之间的通信。GCM服务器负责处理消息队列和分发至运行在Android设备上的目标应用的各个方面。

GCM还提供另一组重要特性。例如,Android设备接收消息不再需要轮询。相反,当接收到应用服务器发送的数据时,GCM服务器将推送数据至已注册过的设备。避免轮询延长了移动设备电池的使用时间。此外,Android应用即使不处于运行状态也能收到来至GCM的消息,当消息被推送至设备时,如果符合必要的规定,就可以通过广播唤醒应用。

不可否认,GCM是一个很好的技术,用GCM开发LZ所说的需求,非常适合。

官方文档见:http://developer.android.com/guide/google/gcm/index.html

值得学习哦!

使用道具 举报

回复
认证徽章
论坛徽章:
211
白羊座
日期:2016-03-22 08:17:34青年奥林匹克运动会-三人篮球
日期:2014-09-15 02:28:46青年奥林匹克运动会-射箭
日期:2014-09-15 01:42:34青年奥林匹克运动会-帆船
日期:2014-09-13 08:58:09青年奥林匹克运动会-三人篮球
日期:2014-09-13 05:28:31青年奥林匹克运动会-三人篮球
日期:2014-09-12 19:37:47青年奥林匹克运动会-手球
日期:2014-09-12 17:22:08青年奥林匹克运动会-拳击
日期:2014-09-10 06:22:35青年奥林匹克运动会-游泳
日期:2014-09-09 18:51:21青年奥林匹克运动会-手球
日期:2014-09-09 18:35:15
发表于 2012-10-18 16:41 | 显示全部楼层
Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层。
企业级应用数据传输协议一般是用TCP/IP,android有自己的httpuriconnection、还有HttpPost、HttpGet方法,可以发送post/get请求,返回流,然后根据流的返回类型进行解析,一般返回为XML或者json,当然也可以用socket通信。如果是UDP协议,可以用DatagramSocket ,具体用法网上很多

使用道具 举报

回复
论坛徽章:
0
发表于 2012-10-18 17:58 | 显示全部楼层
XMPP或MQTT,牛比的像楼上说的自己写

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
发表于 2012-10-18 20:50 | 显示全部楼层
楼主写的?

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
发表于 2012-10-18 20:50 | 显示全部楼层
赚了多少银子啊?

使用道具 举报

回复
认证徽章
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2012-10-19 09:00 | 显示全部楼层
Sky-Tiger 发表于 2012-10-18 20:50
楼主写的?

不是的。有写书的念头,时间、精力都不够。

使用道具 举报

回复
认证徽章
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2012-10-19 21:08 | 显示全部楼层
在Android平台,选择GCM是好主意,如果选择其它实现方法,工作量要大很多。

使用道具 举报

回复
论坛徽章:
11
ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:372014年新春福章
日期:2014-02-18 16:41:11技术图书徽章
日期:2013-11-19 14:48:37ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:422013年新春福章
日期:2013-04-08 17:42:482013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2012-11-28 09:37:30奥运纪念徽章
日期:2012-11-27 15:37:34奥运纪念徽章
日期:2012-11-27 09:46:24奥运会纪念徽章:篮球
日期:2012-10-12 15:12:02
发表于 2012-10-20 20:32 | 显示全部楼层
用GCM确实是好办法。

使用技巧(原创):
1. 打开https://code.google.com/apis/console 页面,用gmail账户登录,显示如下:

gcm1.jpg

2. 点击“Create project”,会列出所有的服务,如图所示:
gcm2.jpg

注意浏览器上的地址:https://code.google.com/apis/console/#project:187848899082:services
#project:后面紧跟的是你的项目ID。

3. 找到Google Cloud Messaging for Android,开启该选项,如图所示:
gcm3.jpg

4. 接受Google APIs Terms of Service协议,可以看到,GCM服务已经开启。
gcm4.jpg

5. 选择左边的API Access,可以看到:
gcm5.png

6. 点击"Create new Server key",保存key值,以后要用。


7. 用Android的SDK Manager工具,选择Extras->Google Messaging for Android Library,安装这个库。
一旦安装完成,SDK目录下会有gcm-client,gcm-server,以及一些示例程序。

8. 要在Android项目中使用gcm功能,把gcm.jar放入项目类路径下。
其次修改Android的manifest配置:

  1. <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/>
复制代码

再接着声明和使用GCM的访问许可。

  1. <permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
  2. <uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />

  3. <!-- App receives GCM messages. -->
  4. <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
  5. <!-- GCM connects to Google Services. -->
  6. <uses-permission android:name="android.permission.INTERNET" />
  7. <!-- GCM requires a Google account. -->
  8. <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  9. <!-- Keeps the processor from sleeping when a message is received. -->
  10. <uses-permission android:name="android.permission.WAKE_LOCK" />
复制代码

最后添加广播接收器

  1. <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
  2.   <intent-filter>
  3.     <action android:name="com.google.android.c2dm.intent.RECEIVE" />
  4.     <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
  5.     <category android:name="my_app_package" />
  6.   </intent-filter>
  7. </receiver>
复制代码


以及添加intent服务

  1. <service android:name=".GCMIntentService" />
复制代码


编写代码。
ok!

使用道具 举报

回复
论坛徽章:
52
慢羊羊
日期:2015-05-27 16:05:40灰彻蛋
日期:2012-02-28 15:52:532012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20蛋疼蛋
日期:2012-01-04 18:27:252012新春纪念徽章
日期:2012-01-04 11:49:54紫蛋头
日期:2011-12-27 15:12:01
发表于 2012-10-21 14:54 | 显示全部楼层
1. 如何设计程序架构,以便能够满足以上需求?
在服务化后引入“版权标签”的概念,在交互中借助多对多的优势,将压力分布到合理的服务端上。

2. 如何让解决方案更高效?
对发布的内容进行规划,对无法就地访问的情况进行管理。

3、目前存在的困难?
不具有统一的标准,应建立标准;对基础设施的管理仍存在不足;相关应用的合作还没有在纵向上形成。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表