-
Notifications
You must be signed in to change notification settings - Fork 0
/
android 开发规范
60 lines (54 loc) · 7.14 KB
/
android 开发规范
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#android开发规范
[1] Android 资源文件命名与使用
* Activity 的 layout 以 module_activity 开头
* Fragment 的 layout 以 module_fragment 开头
* Dialog 的 layout 以 module_dialog 开头
* include 的 layout 以 module_include 开头
* ListView 的行 layout 以 module_list_item 开头
* RecyclerView 的 item layout 以 module_recycle_item 开头
* GridView 的 item layout 以 module_grid_item 开头
* 模块名_逻辑名称_颜色
[2] Android 基本组件
* 持久化存储 应该在 Activity#onPause()/onStop()中实行
* 避免在 Service#onStartCommand()/onBind()方法中执行耗时操作,如果确 实有需求,应改用 IntentService 或采用其他异步机制完成。
* 避免在 BroadcastReceiver#onReceive()中执行耗时操作,如果有耗时工作, 应该创建 IntentService 完成,而不应该在 BroadcastReceiver 内创建子线程去做。
* 不要在 Activity#onDestroy()内执行释放资源的工作,例如一些工作线程的 销毁和停止,因为 onDestroy()执行的时机可能较晚。可根据实际需要,在 Activity#onPause()/onStop()中结合 isFinishing()的判断来执行。
* 如非必须,避免使用嵌套的 Fragment。
* 当前 Activity 的 onPause 方法执行结束后才会创建(onCreate)或恢复 (onRestart)别的 Activity,所以在 onPause 方法中不适合做耗时较长的工作,这 会影响到页面之间的跳转效率。
[3] UI 与布局
* 不要使用 LinearLayout 嵌套, 改用 RelativeLayout,可以有效降低嵌套数。
* 在 Activity 中显示对话框或弹出浮层时,尽量使用 DialogFragment,而非 Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期
* 文本大小使用单位 dp,View 大小使用单位 dp。对于 TextView,如果在文字大小确定的情况下推荐使用 wrap_content 布局避免出现文字显示不全的适配问题。
* 禁止在设计布局时多次为子 View 和父 View 设置同样背景进而造成页面过 度绘制,推荐将不需要显示的布局进行及时隐藏。
* 不能在 Activity 没有完全显示时显示 PopupWindow 和 Dialog。 推荐的做法是在 Activity#onAttachedToWindow() 之后(其实最好是 Activity#onWindowFocusChanged() 之后)才创建对话框。
* 不能使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew; 目前为了较好的 UI 体验,更贴 近 Material Design 的设计,推荐使用 NestedScrollView。
* 不要在 Android 的 Application 对象中缓存数据。 基础组件之间的数据共享 请使用 Intent 等机制,也可使用 SharedPreferences 等数据持久化机制。
* 使用 Toast 时,建议定义一个全局的 Toast 对象,这样可以避免连续显示 Toast 时不能取消上一次 Toast 消息的情况。即使需要连续弹出 Toast,也应避免直 接调用 Toast#makeText。
* 使用 Adapter 的时候,如果你使用了 ViewHolder 做缓存,在 getView()的 方法中无论这项 convertView 的每个子控件是否需要设置属性(比如某个 TextView 设置的文本可能为 null,某个按钮的背景色为透明,某控件的颜色为透明等),都需 要为其显式设置属性(Textview 的文本为空也需要设置 setText(""),背景透明也需要 设置),否则在滑动的过程中,因为 adapter item 复用的原因,会出现内容的显示错 乱。
* end
[4] 进程、线程与消息通信
* 不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction 缓存为 1MB),可能导致 OOM。
* 在 Application 的业务初始化代码加入进程判断,确保只在自己需要的进程 初始化。特别是后台进程减少不必要的业务初始化。
* 新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor 或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。
* end
[5] Bitmap、Drawable 与动画
* 加载大图片或者一次性加载多张图片,应该在异步线程中进行。图片的加 载,涉及到 IO 操作,以及 CPU 密集操作,很可能引起卡顿。
* png 图片使用 TinyPNG 或者类似工具压缩处理,减少包体积。
* 在 Activity#onPause()或 Activity#onStop()回调中,关闭当前 activity 正在执 行的的动画。
* 在动画或者其他异步任务结束时,应该考虑回调时刻的环境是否还支持业 务处理。例如 Activity 的 onStop()函数已经执行,且在该函数中主动释放了资源, 此时回调中如果不做判断就会空指针崩溃。
* 使用 RGB_565 代替 RGB_888,在不怎么降低视觉效果的前提下,减少内 存占用。 但是一定要注意 RGB_565 是没有透明度的,如果图片本身需要保留透明度,那么 就不能使用 RGB_565。
* 尽量减少 Bitmap(BitmapDrawable)的使用,尽量使用纯色(ColorDrawable)、 渐变色(GradientDrawable)、StateSelector(StateListDrawable)等与 Shape 结 合的形式构建绘图。
* 谨慎使用 gif 图片,注意限制每个页面允许同时播放的 gif 图片,以及单个 gif 图片的大小。
* 大图片资源不要直接打包到 apk,可以考虑通过文件仓库远程下载,减小包 体积。
* 根据设备性能,选择性开启复杂动画,以实现一个整体较优的性能和体验;
* 在有强依赖 onAnimationEnd 回调的交互时,如动画播放完毕才能操作页 面 , onAnimationEnd 可能会因各种异常没被回调 (参考: https://stackoverflow.com/questions/5474923/onanimationend-is-not-getting-calle d-onanimationstart-works-fine ),建议加上超时保护或通过 postDelay 替 代 onAnimationEnd。
* 当 View Animation 执行结束时,调用 View.clearAnimation()释放相关资源。
* end
[6] 安全
* 如果使用自定义 HostnameVerifier 实现类,必须在 verify()方法中校验服务 器主机名的合法性,否则可能受到中间人攻击。
* 如果使用自定义 X509TrustManager 实现类,必须在 checkServerTrusted() 方法中校验服务端证书的合法性,否则可能受到中间人攻击。
* WebView 应设置 WebView#getSettings()#setAllowFileAccess(false)、 WebView#getSettings()#setAllowFileAccessFromFileURLs(false) 、 WebView#getSettings()#setAllowUniversalAccessFromFileURLs(false),阻止 file scheme URL 的访问。
* addJavascriptInterface() 可以添加 JS 对本地 Java 方法的调用,但这本身会导致恶意代码的攻击。在 Android 4.2(API Level 17)以下,不应再使用这样的 调用方式。在 Android 4.2 及以上,需要对本地被远程调用的方法显式添加 @JavascriptInterface annotation。
* 使用 Android 的 AES/DES/DESede 加密算法时,不要使用 ECB 加密模式, 应使用 CBC 或 CFB 加密模式。
* 在 Android 4.2(API Level 17)及以上,对安全性要求较高的应用可在 Activity 中,对 Activity 所关联的 Window 应用 WindowManager.LayoutParams.FLAG_ SECURE,防止被截屏、录屏。但要注意的是,一个 Activity 关联的 Window 可 能不止一个,如果使用了 Dialog / DialogFragment 等控件弹出对话框,它们本身 也会创建一个新的 Window,也一样需要保护。
* end