
Android
chcc_V5
Java + Android 里总共泡了5年,在深圳金立手机公司里干了3年,对Framework层代码有着一行一行拿着放大镜排查问题的经历,熟悉Android底层代码。我有着 上层App --> Android 底层 -->上层App + 服务器系统 的技术成长路线,积累了对Android系统的上下整体认知,对软件构造,软件管理,技术选型有一些心得,我现在是一家公司的合伙人,在主持一个智能眼镜相关的项目。
展开
-
使用Time类遍历一学期的所有天
<br />/* 遍历一学期的所有天 */ Time t = new Time(); t.set(21, 1, 2011); // 2011-2-21日 Log.i("test", "t:" + t.format2445() + " " + t.getWeekNumber() + " " + t.toMillis(true)); t.normalize(true); // 没有这一步计算结果总会出错,到底这一步做了些什么还不清楚原创 2011-05-17 15:39:00 · 1224 阅读 · 0 评论 -
“android源码目录”/mediatek/source/frameworks路径下的源文件编译
“android源码目录”/mediatek/source/frameworks,这个路径下的很多项目是没有相应的Android.mk文件的,所以想直接在该目录下单编是不可能的。不过也有办法,实际上编译的时候,这些代码是跟 “android源码目录”/frameworks 一起编译的,只不过没有copy到 “android源码目录”/frameworks 路径下而已。直接证据是 “androi原创 2012-04-18 19:02:50 · 1127 阅读 · 0 评论 -
获取SIM/UIM卡的联系人容量及已用容量信息
import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.os.RemoteException;import android.os.SystemClock;import com.android原创 2012-04-18 19:04:10 · 2277 阅读 · 1 评论 -
关于一个通信层的设计
通信层通常作为一个软件的底层,负责与外界打交道。 这里的通信特指异步通信,发出的请求可能得不到响应,可能很久才响应,也可能返回无效响应。但为了请求一方的上层能够正常工作,一个通信层应该能完全应付这些情况。以下是总结的几点,不分先后,同等重要。每个任务都有唯一的身份标识。每个已发送请求的任务都进入已发送队列(写到这里想起了ril.java),任务完成(返回了响应结果)时原创 2012-04-18 18:46:55 · 905 阅读 · 0 评论 -
不能使用IDE调试? 照样能很快定位问题
经常调试Android framework错误,framework不可能想使用IDE来step-by-step的调试。 为此,有时需要插入大量的log来帮助定位问题;有时知道了具体执行功能的函数,却发现调用者太多仍难以定位问题,最后只得花大把时间去阅读代码。 作为程序员,偷懒是种美德。我希望敲入调试语句的时候能偷懒一点,也希望能很容易地知道调用者是谁,于是有了下文。pa原创 2011-12-22 18:03:43 · 579 阅读 · 0 评论 -
编写程序配置、设置界面,你还在用listview吗,还在使用自定义dialog吗?
编写程序配置、设置界面,你还在用listview吗,还在使用自定义dialog吗?记得自己在写第一个android应用的时候就干过这“蠢”事,不过以后都不用这么辛苦了,android不仅有封装好的组件(如:CheckBoxPreference,ListPreference),还有一个PreferenceActivity。下边简单得用一个例子展示一下用法:在Android项目中新建一原创 2012-04-18 18:38:10 · 812 阅读 · 0 评论 -
关于Systemproperty
Systemproperty是Android的属性系统。调用Systemproperty.set(key, value)时,并非简单地往系统里设置一个值,而是还会检查key的合法性。特定名称的前缀只能做特定操作(如“ro.”是只读的), 特定的进程/服务只能操作特定前缀的键名。不合法则无法修改为新的value,但没有任何出错提示。跟这个属性系统相关的文件有service_manager原创 2012-04-18 18:39:28 · 784 阅读 · 0 评论 -
关于ril.java的胡说八道
Regisiterant的设计意图:只是作为一个“注册”而存在,跟addObserver()一个道理,但由于注册的是某个Handler的Message对象,所以当回调时不像观察借口那样必须马上执行(“同步回调”),而是可以缓冲到Handler的队列中,相当于“异步回调”。将Message对象作为参数或作为其他对象的成员,其设计意图是:给你根猴毛,你收藏着,有事就将它吹响空中(用出来就没原创 2012-04-18 18:44:20 · 555 阅读 · 0 评论 -
用命令行运行单元测试
对于如下的manifest文件 package="com.android.calculator2.tests"> android:targetPackage="com.android.calculator2" android:label="Calculator Launch Per原创 2012-04-18 19:00:28 · 1668 阅读 · 0 评论 -
Android编程经验
总在解Bug,发现很多Bug其实来得很不必要,这是我总结的几点。1. 不要假定那个Activity会被先调用,每个Activity都应该是独立的。唯一一定会被先调用的是Application,多个Activity、多个Service的共用部分(如数据库,util)的初始化工作(及退出时的清理工作)都应放到放到这里来。这样可保证你的Activity是一个独立的共享单元。2.原创 2012-04-18 18:19:08 · 484 阅读 · 0 评论 -
日期时间的格式化符号
Android @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); for (int i = 0原创 2012-04-18 18:58:19 · 757 阅读 · 0 评论 -
两种跨进程通讯的方式,都以activity + service的示例
... android:icon="@drawable/ic_launcher" android:label="@string/app_name" >原创 2012-04-18 18:49:56 · 528 阅读 · 0 评论 -
Android字符串资源编译错误的解决方法
<br />在较老的Android版本上多个字符串占位符可以如下这么写,但若导入新版本编译时就会报错<br /><string name="template_word_title">"%s%s%s "</string><br /> <br /> <br />解决的方式如下:<br /><string name="template_word_title">"%1$s%2$s%3$s "</string>原创 2011-04-22 20:02:00 · 918 阅读 · 0 评论 -
Android开发之旅:活动与任务[转]
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://skynet.blog.51cto.com/1943397/365383引言关于Android应用程序原理及术语,前面两篇:Android开发之旅:应用程序基础及组件Android开发之旅:应用程序基础及组件(续)介绍了Andro转载 2011-06-20 21:13:00 · 450 阅读 · 0 评论 -
使用基于AIDL接口的典型套路
使用基于AIDL接口的典型套路 try { final ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); if(phone!= null && !phone.isSimInsert(sim原创 2011-11-24 17:56:43 · 469 阅读 · 0 评论 -
一些比较好的Android文章
Android系统源代码情景分析:基础知识作者 罗升阳 发布于 2011年12月14日摘要:我们知道,Android系统是基于Linux内核来开发的,在分析它在运行时库层的源代码时,我们会经常碰到诸如管道(pipe)、套接字(socket)和虚拟文件系统(VFS)等知识。此外,Android系统还在Linux内核中增加了一些专用的驱动程序,例如用于日志系统的Lo原创 2011-12-23 22:04:45 · 537 阅读 · 0 评论 -
这是/etc/udev/rules.d/51-android.rules文件的内容,Ubuntu不能直接识别android手机的usb接入,需要配置一下该文件。
这是/etc/udev/rules.d/51-android.rules文件的内容,Ubuntu不能直接识别android手机的usb接入,需要配置一下该文件。# adb protocol on passion (Nexus One)SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="06原创 2012-04-18 18:23:16 · 5601 阅读 · 0 评论 -
Android的日志
Slog打印的日志用 adb logcat -b system 查看-b后边加events 查看DVM虚拟机日志(是虚拟机吗?);radio 查看无线及射频相关的日志;main the default,一般的应用输出的日志,即Eclipse查看到的;注:这些参数可能是来源于android系统下的 /dev/log/chencc@chencc-desk原创 2012-04-18 18:28:37 · 698 阅读 · 0 评论 -
一旦需要使用共用pid,请把使用pid部分独立开来
解决方案:使用service,intentService 等,让服务运行于pid中,程序的其他部分通过这些个服务来间接使用这些pid的功能。或者使用aidl,就像ITelephony 和 PhoneInterfaceManager。原创 2012-04-18 18:32:54 · 2177 阅读 · 0 评论 -
有没有这样的调试工具
针对这样一个问题手机在灭屏状态下,呼入以来电,观察来电界面。结果:手机来电时先显示锁屏界面,然后才显示呼入界面,而对比机不会。1. 这种在a机上有,b机上没有的问题,我们最容易想到的解决方法就是,对比一下日志(或代码,此处不理会这种情况),看一下有什么不同,然后分析不同的地方。不过靠人工对比效率低得太可怕了。能有工具吗?如:提取出相同的日志记录,忽略掉干扰内容;原创 2012-04-18 18:36:47 · 491 阅读 · 0 评论 -
try的代码必须是一个原子整体,不要什么东西都往try里边塞
try的代码必须是一个原子整体,只是为了完成一个功能,不要什么东西都往try里边塞。还是以例子说明吧,下边一个例子是检查两个标志位,本来这两个标志位没什么相关性,但因为被绑在了一起就产生了一些笑话。在一次真实的运行中,第一个isPass()出了异常,结果导致了接下去的语句没有执行,输出的结果成了两个“unknow”,而实际上第二个sPass()若能执行,它的结果会是pass。原创 2012-04-18 18:43:35 · 1546 阅读 · 0 评论 -
一种实现“通信层”的方案,主要演示超時控制
/** * 一种实现“通信层”的方案,主要演示超時控制 * * 2012-12-26 according the Thinking in Java */package concurrent;import java.util.ArrayList;import java.util.concurrent.Callable;import java.util.concurrent.Ex原创 2012-12-26 14:51:41 · 534 阅读 · 0 评论