Android生存指南之:开发中的注意事项
程序员文章站
2023-11-20 18:07:10
1. 为activity声明系统配置变更事件系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果activity没有声明处理这些事件,发生事件时,系统会把...
1. 为activity声明系统配置变更事件
系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果activity没有声明处理这些事件,发生事件时,系统会把activity杀掉然后重启,并尝试恢复状态,activity有机会通过onsaveinstancestate()保存一些基本数据到bundle中,然后此bundle会在activity的oncreate()中传递过去。虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如dialog等是要依赖于具体activity实例的。所以这种系统默认行为通常都不是我们想要的。
为了避免这些系统默认行为,就需要为activity声明这些配置,如下二个是每个activity必须声明的:
<activity android:configchanges="orientation|keyboardhidden">
几乎所有的activity都要声明如上,为什么android不把它们变成default的呢?
2. 尽量使用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等。
3. 要考虑到activity和进程被杀掉的情况
如了通常情况退出activity外,还有activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是activity处理重要的数据时,做好的数据的保存。
4. 小心多语言
有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。也要注意特殊语言比如那些从右向左读的语言。
5. 不要用四大组件去实现接口
一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。
6. 用getapplication()来取context当参数
对于需要使用context对象作为参数的函数,要使用getapplication()获取context对象当参数,而不要使用this,除非你需要特定的组件实例!getapplication()返回的context是属于application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有context对象也不会引发内存泄露。
7. 主线程只做ui控制和frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过handler。这样就可以避免大量的线程问题。
8. frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用handler schedule到稍后再做。
9. 要考虑多分辨率
至少为hdpi, mdpi, ldpi准备图片和布局。元素的单位也尽可能的使用dip而不要用px。
10. 利用android手机的硬键
几乎所有的android手机都有back和menu,它们的作用是返回和弹出菜单,所以就不要再在ui中设计返回按扭和菜单按扭。很多优秀的应用如随手记和微信都有返回键,他们之所以有是因为他们都是从ios上移植过来的,为了保存体验的一致,所以也有了返回和菜单。但这不够android化,一个纯正的android是没有必须重复硬键的功能的。
系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果activity没有声明处理这些事件,发生事件时,系统会把activity杀掉然后重启,并尝试恢复状态,activity有机会通过onsaveinstancestate()保存一些基本数据到bundle中,然后此bundle会在activity的oncreate()中传递过去。虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如dialog等是要依赖于具体activity实例的。所以这种系统默认行为通常都不是我们想要的。
为了避免这些系统默认行为,就需要为activity声明这些配置,如下二个是每个activity必须声明的:
<activity android:configchanges="orientation|keyboardhidden">
几乎所有的activity都要声明如上,为什么android不把它们变成default的呢?
2. 尽量使用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等。
3. 要考虑到activity和进程被杀掉的情况
如了通常情况退出activity外,还有activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是activity处理重要的数据时,做好的数据的保存。
4. 小心多语言
有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。也要注意特殊语言比如那些从右向左读的语言。
5. 不要用四大组件去实现接口
一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。
6. 用getapplication()来取context当参数
对于需要使用context对象作为参数的函数,要使用getapplication()获取context对象当参数,而不要使用this,除非你需要特定的组件实例!getapplication()返回的context是属于application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有context对象也不会引发内存泄露。
7. 主线程只做ui控制和frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过handler。这样就可以避免大量的线程问题。
8. frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用handler schedule到稍后再做。
9. 要考虑多分辨率
至少为hdpi, mdpi, ldpi准备图片和布局。元素的单位也尽可能的使用dip而不要用px。
10. 利用android手机的硬键
几乎所有的android手机都有back和menu,它们的作用是返回和弹出菜单,所以就不要再在ui中设计返回按扭和菜单按扭。很多优秀的应用如随手记和微信都有返回键,他们之所以有是因为他们都是从ios上移植过来的,为了保存体验的一致,所以也有了返回和菜单。但这不够android化,一个纯正的android是没有必须重复硬键的功能的。
上一篇: python分割文件的常用方法
下一篇: CAD图纸不能复制粘贴该怎么办?
推荐阅读