目前唯一的线索,是平果旧城百椅墓碑文上记载道:“遥知我太祖贵旦公原系大明永乐年间山西省太原府曲原县保德乡人也。时屡屡迁迁,干戈迭起,迁迁离故土聊焉。失陌孤莺,寄迹他乡,仍作来南阵雁,携抱幼子万宗隐居奉化,世传此事,铭刻心中”。
恳求山西保德县所有黄姓的朋友,如果你们的家谱有提到过某代有人迁移到广西的,请给我们提供一点线索,以便我们完善我们的族谱,也需要有奇迹出现,让我们找到山西的同族人,在此先说一声谢谢了!
目前唯一的线索,是平果旧城百椅墓碑文上记载道:“遥知我太祖贵旦公原系大明永乐年间山西省太原府曲原县保德乡人也。时屡屡迁迁,干戈迭起,迁迁离故土聊焉。失陌孤莺,寄迹他乡,仍作来南阵雁,携抱幼子万宗隐居奉化,世传此事,铭刻心中”。
恳求山西保德县所有黄姓的朋友,如果你们的家谱有提到过某代有人迁移到广西的,请给我们提供一点线索,以便我们完善我们的族谱,也需要有奇迹出现,让我们找到山西的同族人,在此先说一声谢谢了!
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是什么? 不就多说了,翻墙从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
简要说明一下: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
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.通过 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是一样的。