1、layout的命名方式:(尽量带上模块名)
Activity的layout以module_activity开头
Fragment的layout以module_fragment开头
Dialog的layout以module_dialog开头
include的layout以module_include开头
ListView的item layout以module_list_item开头
RecyclerView的item layout以module_recycle_item开头
GridView的item layout以module_grid_item开头
2、资源文件的命名:
①drawable资源文件的命名:(以小写单词,下划线的方式命名),根据分辨率的不同,存放到不同的drawable的目录下,建议只使用一套,例如drawable-xhdpi.
模块名业务功能描述控件描述控件状态限定词
module_login_btn_pressed
②anim资源名称以小写单词+下划线的方式命名:模块名逻辑名称[方向][序号]
module_fade_in module_fade_out
③color资源使用#AARRGGBB格式,模块名逻辑名称_颜色
<color name="module_btn_bg_color">#33b5e5e5</color>
④id资源原则上用驼峰法命名,View组件的资源id需要以View的缩写作为前缀,LinearLayout(ll),RelativeLayout(rl),ConstraintLayout(cl),ListView(lv),ScrollView(sv),TextView(tv),Button(btn),ImageView(iv),CheckBox(cb),RadioButton(rb),EditText(et),ProgressBar(progress_bar),DatePicker(date_picker)
⑤大分辨率(单位度超过1000)的大分辨率图片建议统一放在xxhdpi目录下管理,否则将导致占用内存成倍数增加。
三、Android基本组件(Activity,Service,BroadcastReceiver,ContentProvider,Fragment)
①Activity中的onSaveInstanceState()方法不是Activity的生命周期,其在典型的Activity的生命周期的方法中是不会被调用的,但是当Activity意外销毁(切换屏幕的时候),调用onSaveInstanceState来保存UI的状态,只能用于保存临时数据。持久化存储应该在Activity的onPause/onStop()中来实行。
②Activity间通过隐式Intent的跳转,在发出Intent之前必须通过resolveActivity检查,避免找不到合适的调用组件,造成ActivityNotFoundException.
③避免在Service的onStartCommand()/onBind()方法中执行耗时的操作,可以改成在IntentService的handleIntent或者其他异步机制来完成。
④总是适用显示Intent启动或者绑定Service,且不要为服务生命Intent Filter,保证应用的安全性,如果确实使用隐式调用,则可为Service提供Intent Filter并从Intent中排除相应的组件名称,但是必须搭配使用Intent的setPackage()方法设置Intent的指定包名,这样可以充分消除目标服务的不确定性。
⑤当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate,所以在onPause方法中不适合做耗时较长的工作,这样会影响页面之间的跳转效率。
⑥Activity或者Fragment中动态注册BroadCastReceiver时,registerReceiver()和unregisterReceiver()要成对出现,如果不成对出现,则可能导致已经注册的receiver没有在合适的时机注销,导致内存泄漏,占用内存空间,加重SystemService负担。
四、UI与布局:(measure,layout,draw)
①布局中不得使用ViewGroup多重嵌套,尽量不要使用LinearLayout嵌套,应该改为RelativeLayout,可以有效降低嵌套数,保持扁平的View结构。
②在Activity中显示对话框或弹出浮层时,尽量使用DialogFragment,而非Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。
③文本大小使用单位sp,view使用单位dp,对于TextView,如果在文字大小确定的情况下,推荐使用wrap_content布局避免出现文字显示不全的适配问题。
④不能在Activity没有完全显示PopupWindow和Dialog
⑤尽量不要使用AnimationDrawable,它在初始化的时候就将所有的图片加载到内存中,特备占内存,并且还不能释放,释放之后下次进入再次加载时会报错。
⑥不能使用ScrollView包裹ListView/GridView/ExpandableListView,因为这样会把ListView的所有的Item都加载到内存中,要消耗巨大的内存和cpu去绘制图面。
五、进程、线程与消息通信:
①新建线程的时候,必须通过线程池提供(AsybcTask或者ThreadPoolExecutor或者其他形式自定义的线程池),不允许在应用中自定义显示创建线程。(使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不适用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者"过度切换"的问题,另外创建匿名线程不便于后续的资源使用分析,对性能分析造成困扰。
②子线程中不能更新界面,更新界面必须在主线程中进行,网络操作不能在主线程中调用。
六、文件与数据库
①任何时候不要硬编码文件路径,Android应用模块提供内部和外部存储,分别用于存放应用自身数据以及应用产生的用户数据。
②SharedPreference提交数据时,尽量使用Editor.apply(),而非Editor.commit。一般来讲,仅当需要确定提交结果,并据此有后续操作的时候,才使用Editor.commit。(SharedPreference相关修改使用apply方法进行提交会先写入内存,然后再异步写入磁盘,commit方法是直接写入磁盘,如果操作频繁的话,apply的性能会优于commit.
七、Bitmap、Drawable与动画
①加载大图片或者一次性加载多张图片的时候,应该在异步线程中进行(继承自AsyncTask,在doInBackground的方法中执行图片加载),因为图片的加载涉及到IO的操作,以及CPU的密集操作,很可能引起卡顿。
②使用完图片时,应该释放内存。(如:bitmap.recycle();)
③页面退出或者暂停的情况下,及时清理动画内存资源。(mImageView.clearAnimation())
④在动画或者其他异步任务结束时,应该考虑回调时刻的环境是否还支持业务处理,例如Activity的onStop()函数已经执行,且在该函数中主动释放了资源,此时回调如果不做判断就会产生空指针崩溃。
⑤尽量减少Bitmap(BitmapDrawable)的使用,尽量使用纯色(ColorDrawable),渐变色(GradientDrawable),StateSelector(StateListDrawable)等与Shape结合的形式构建绘图。
八、安全:
①使用PendingIntent时,禁止使用空Intent,同时禁止使用隐式Intent,因为使用了空Intent会导致恶意用户劫持修改Intent的内容。禁止使用一个空的Intent去构造PendingIntent,构造PendingIntent的Intent一定要设置ComponentName或者action.
网友评论