Monthly Archives: March 2011

Android网络应用开发

Android网络应用开发

反复研究了 Android Market,总结一下,之前发在新浪微博上,但不够详细,主要是提高用户体验。

1.网络异常处理,重试机制。
上wifi常常网络断开,那就看运用程序是否健壮。可以用Android 提供的 frameworks/base/core/java/android/net/NetworkConnectivityListener.java 监控网络变化,然后做相应的处理。

2.Cache
这个是必须的。比如手机QQ的头像,不可能每一次登录,重新把头像下载一遍。可以是内存cache,也可以写入SD卡。

3. 本地数据与服务器同步机制

4.请求异步处理机制
给一个app打分,打分后,马上回到之前的界面,而不是一直在等是否把数据发送到了服务器再响应。

5. push消息通知
有软件可以更新,在状态栏提示。新浪微博在右上方显示有新数据。

6.lazyload
延时加载,比如图标,头像,分页。

7.数据交换格式:对象序列化/protobuf/json/xml。

8. 设计模式:MVC,chain。

c2dm 使用心得总结

关于 c2dm是什么? 不就多说了,翻墙从youtube下载 Google I/O 2010 – Building push applications for Android (C2DM) 转发到youku 方便观看, 地址为:http://v.youku.com/v_show/id_XMjQ3MTg1NzA0.html

c2dm开发组提供的两个demo,似乎不是那么容易上手,可以试试最简单的的实例, Mark Murphy __The Busy Coder’s Guide To Advanced Android Development__ 的一个例子: https://github.com/commonsguy/cw-advandroid/tree/master/Push/C2DM

程序跑起来了,才有个直观的感受。c2dm整个流程是这样的:
C2DM 流程图

简要说明一下:Android 客户端收到 registration_id 后,给你的app server发个http post,保存registration_id起来。然后你的appserver 给 https://android.apis.google.com/c2dm/send 这个url发送一些参数,就行了。

Mark Murphy的例子用到了Chrome to Phone 一个可重用的包com.google.android.c2dm 用于处理底层的 C2DM 交互事务 (例如配置,任务队列管理等)。但是这个包也是有一些问题的,遇到 “C2DM E Registration error SERVICE_NOT_AVAILABLE” 这个的Error,默认是没有去处理,你需要在AndroidManifest.xml 里声明处理 com.google.android.c2dm.intent.RETRY。

在申请google c2dm 记得ssh 翻墙 注册就行了,firefox + autoproxy, 在规则添加 .google.com 即可。不然会遇到: “Sign Up for Android Cloud to Device Messaging” 链接被重置,提交时总是说还有一两项信息没有填写(其实都填全了)。

服务器端的实现

就是给 c2dm 服务器发 https post 请求,加上一些参数。 写得最简单明了,是这个帖子 Android push notifications (tutorial) 例子中的脚本可以再改进的, Google Auth Token 过一段时间才会失效,我测试所知道的是1个多月,所以可以把它保持起来,提供下次发送数据时使用。我自个儿也写了php实现的版本。关于发送效率,我也是感到比较头疼的,发送数据到几万个终端,如何并发处理?c2dm不支持并发发送数据。目前我只做到重用 http 连接,把registerIds放到队列里,发送失败了,放到队列尾部,重发。

除此之外,c2dm服务在国内很不稳定,把 app server 放在在国外才比较靠谱。

参考:
1. http://goobr.blogspot.com/2010/11/c2dm-sending-messages.html

Andrord Market Filters base on Device configuration

http://developer.android.com/guide/appendix/market-filters.html

In this document it described the filtering rules. But what exactly it is? In the past year, I payed lots of time to debug the market, gapps.So I decide to write a small tool to show Android Market collect your device configuration , mainly use for Android porting debug. You can easily to see why your device can’t search some apps in Android Market if it has not the featrues meets the market filter. The quick way to find out what happen is that compares with other phone install this same app

The QR code as bellow, your android version should be >= 2.2

Code Review

每周六下午都对自己的代码进行一次 code review.通过 svn log记录,总结主要修改的:

1. 先阅读一遍Android编码风格
2. 添加文件头版权信息
3. 添加注释
4. tab to 4 spaces , 通过 trac 阅读代码,很容易找出。
5. 重命名函数名及参数,让它看起来更合理。
6. 去掉 magic number
7. 删除重复的代码,没用的代码
8. 减少大函数,拆分成小函数
9. 源代码后面要空一行
10. 更新设计文档

对于第7点,比如boolean 函数力求简凑,

-            if (deviceRegistrationId == null) {
-                return false;
-            } else {
-                return true;
-            }
+
+            return (deviceRegistrationId != null);

下面是对应的 ddx 格式

133     .local v0, deviceRegistrationId:Ljava/lang/String;
134     if-nez v0, :cond_0
135     
136     .line 383
137     const/4 v2, 0x0
138     
139     .line 385
140     :goto_0
141     return v2
142 
143     :cond_0
144     const/4 v2, 0x1
145 
146     goto :goto_0
147 .end method


133     .local v0, deviceRegistrationId:Ljava/lang/String;
134     if-eqz v0, :cond_0
135 
136     const/4 v2, 0x1
137 
138     :goto_0
139     return v2
140 
141     :cond_0
142     const/4 v2, 0x0
143 
144     goto :goto_0

编译器编译出来的 ddx是一样的。