参考网上的一些例子。。。。
1 TextView(往往 TextView 派生子类同样适用)调用 setText 方法设置一个 int 型的数据,千万要将该值转为 String,否则在某些设备中它会默认去查询 R 文件中定义的资源(部分设备可能会报空指针异常)。
2 上线之前一定要使用正式签名打包。某
3 在 Activity 中尽可能少的创建 Handler 对象,创建一个主线程 Handler,一个后台 HandlerThread 就可以了。
4 使用线程的地方尽量不要 new Thread,而是使用 AsyncThread 。
5. 为Activity声明系统配置变更事件 系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去。虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的。所以这种系统默认行为通常都不是我们想要的。
为了避免这些系统默认行为,就需要为Activity声明这些配置,如下二个是每个Activity必须声明的:
<activity android:configChanges="orientation|keyboardHidden">
几乎所有的Activity都要声明如上,为什么Android不把它们变成Default的呢?
6. 尽量使用Android的API 这好像是废话,在Android上面开发不用Android API用什么?因为Android几乎支持Java SE所有的API,所以有很多地方Android API与Java SE的API会有重复的地方,比如说对于文件的操作最好使用Android里面Context封装的API,而不要直接使用File对象:
Context.openFileOutput(String); // no File file = new File(String)
原因就是API里面会考虑到Android平台本身的特性;再如,少用Thread,而多使用AsyncTask等。
7. 要考虑到Activity和进程被杀掉的情况 如了通常情况退出Activity外,还有Activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是Activity处理重要的数据时,做好的数据的保存。
8. 小心多语言 有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。也要注意特殊语言比如那些从右向左读的语言。
9. 不要用四大组件去实现接口 一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。
10. 用getApplication()来取Context当参数 对于需要使用Context对象作为参数的函数,要使用getApplication()获取Context对象当参数,而不要使用this,除非你需要特定的组件实例!getApplication()返回的Context是属于Application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有Context对象也不会引发内存泄露。
11. 主线程只做UI控制和Frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过Handler。这样就可以避免大量的线程问题。
12. Frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用Handler Schedule到稍后再做。
13. 要考虑多分辨率 至少为hdpi, mdpi, ldpi准备图片和布局。元素的单位也尽可能的使用dip而不要用px。
14.导入的类库需要和项目在同级目录下,谨防资源文件与类库中冲突
15.textviewsetText为int时候,textview的color代码设置,set/getTextSize 单位问题
16.json 属性节点不能有空格
17.asset下使用第三方字体 xx.ttf 必须都为小写
18.listView自定义adapter中复用holder时候,如果view/checkbox等对应不同状态显示不同的图片,切记情况写全,不然会出现错乱问题。
19.context/getApplicationContext,视你是否需要涉及到ui时候选择合适的context
20.存在复用时候,尽量new对象等操作移到复用之外,以防oom
21.用Activity来显示出的dialog,popupwindow等控件需要在Activity关闭时候(之前也给关了)
22.toast,判断是否格式(为空等)封装
23.ui布局在多机型上的测试
24.new handler时候尽量写在紧跟其他控件的获取之后,防止空指针
25.AlarmManager PendingIntent 这玩意在miui 不管用。。。。
26.部分系统 datepickdialog 的onDateSet 执行两次
27.fragment startActivityForResult 回调
28.如果代码需要做混淆,请注意接口类、接口方法和反射要调的类和方法不要混淆,可以照着Activity等四大组件如何不混淆去做
29.数据库的版本控制好,并且数据库的周期方法(create、update)不要调用getReadableDatabase或者getWriteableDatabase 方法,因为这些方法会继续调用onCreate方法造成递归调用错误
30.通话记录是按手机时间来排序的,所以如果你把时间调到一个很久远的时间(比如2年以后),那你拿到的第一条记录永远是你调到正常时间之前的那个记录
31.子线程不要操作ui,包括但不限于各个view组件、dialog、toast等
32.R文件不能生成基本都是xml有错误,仔细检查
33.高版本(具体忘了)禁用应用通知时(设置里的勾选),toast也无法显示,注意不要乌龙了。
类似的还有使用安全软件禁用联网或者某个组件,导致无法监听到事件或者无法联网,也很折磨人
34.小米的闹钟会间隔5分钟发出(即本来定于28和29的可能都会在30一起出现),在此周期(5分钟,实验得出的,没有代码支持)定时的闹钟会一起响应。
35.service的onstart里的返回值需要注意,如果是默认值(默认值是service被杀系统自动择机启动),在内存紧张的手机上会频繁重启(一秒十几次很正常),而如果你还在里面启动了某些任务,比如联网,会浪费很多流量
36.图片资源名称不要以a开头,尤其a+数字,比如avator01等,很多情况下会出现显示不了的情况,大概记得是android自身的资源会使用a开头来命名,遇到了不妨试试改名,不然真会死人。
37.在Android Library中不能使用switch-case语句访问资源ID。
38.不能再Activity没有显示完全时显示PopupWindow和Dialog.
39.在多进程之间不要用SharedPreferences共享数据,虽然可以(MODE_MULTI_PROCESS),但极不稳定
40.有些时候不能使用Application的Context,不然会报错(比如启动Activity,显示Dialog等):
41.同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑;
42.Android的JNI代码中,有返回类型的函数没有返回值编译的时候也不会报错;
43.当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率;
44.谨慎使用Android的透明主题,透明主题会导致很多问题,比如:如果新的Activity采用了透明主题,那么当前Activity的onStop方法不会被调用;在设置为透明主题的Activity界面按Home键时,可能会导致刷屏不干净的问题;进入主题为透明主题的界面会有明显的延时感;
45.不要在非UI线程中初始化ViewStub,否则会返回null;
46.公共接口一定要考虑到代码重入的情况,能设计为单例就尽量用单例;
47.不要通过Bundle传递大块的数据,否则会报TransactionTooLargeException异常: java - Issue: Passing large data to second Activity
48.尽量不要通过Application缓存数据,这不稳定: 不要在Android的Application对象中缓存数据!
49.尽量不要使用AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次进入再次加载时会报错;
50.9图不能通过tinypng压缩,不然会有问题;
51.genymotion模拟器快是因为它是基于x86架构的,如果你的应用中用到了so,但没有x86架构的so,只能放弃使用它;Android Studio的模拟器也一样;
52Eclipse的Android开发环境配置好后不要轻易升级ADT和build tools,不然会浪费你很多时间,还有就是一个workspace中的工程不要太多,不然每次启动都会很慢;
53.android studio每个版本、gradle每个版本差别都比较大(我是这样认为的),对于jni代码的编译建议在Eclipse中进行,如果在Android studio中开发jni会浪费很多时间,主要是编译脚本的配置比较麻烦;
54.Eclipse中的Lint太不靠谱,特别是主工程中依赖library的时候,很多提示都是有问题的,建议使用Android Studio的工程清理工具,特别推荐;
55.不同API版本的AsyncTask实现不一样,有的是可以同时执行多个任务,有的API中只能同时执行一个线程,所以在程序中同时执行多个AsyncTask时有可能遇到一个AsyncTask的excute方法后很久都没有执行。 调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案
56.谨慎使用Android的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:(1)不能实现完全退出所有Activity的功能(如果有同行在应用内采用多进程成功实现过完全退出程序欢迎沟通交流);(2)首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白屏还是黑屏和新Activity的主题有关);(3)应用内多进程时,新启动一个进程都会重新跑一次Application的onCreate方法,不上重新创建一个Application,但会重新跑Application的onCreate,这样就不能在Application中缓存数据作为内存共享的途径了;(4)多进程间通过SharedPreferences共享数据时不稳定,具体可以查阅《Android开发艺术探索》。