花费了三天时间学习了阿里巴巴 Android 开发规范,顺便通过了Apsara Clouder基础技能认证:阿里巴巴Android开发规范。证可能用处不大,但能反向push自己:1.注重代码规范,磨练基本功;2.保持学习的主动性。推荐搞安卓的同学学一学。
认证考试
-
阿里巴巴 Android 开发规范认证考试地址如下:https://edu.aliyun.com/certification/cldt04,官方注意事项如下:
1、考试共 (40) 道题,总分100分,及格分数80分 2、考试需在(90分钟)内交卷,过程中无法暂停,请提前安排好时间;如未及时交卷,则本次考试作废 3、推荐使用 Chrome 浏览器(版本:73及以上的正式版本),或Firefox浏览器(版本:66及以上的正式版本) 4、开始答题前会进行身份验证,需要您拍摄并上传身份证人像面照片,并按照系统要求开启摄像头进行面部识别
-
40道题均为选择题:单选15道题,多选25道题。理论上只要答对32题及以上即可通过考试。
-
40道题未涉及《阿里巴巴 Java 开发手册》,知识点均在《 Android 开发规范》一书中,但建议同时通读Java开发手册。
-
考试中的部分知识点概括如下,其他知识点建议自行查书:
Android 资源文件命名与使用 1.【推荐】layout/资源文件的命名需带模块前缀。eg:Activity 的 layout 以 module_activity 开头; 2.【推荐】Id 资源原则上以驼峰法命名,View 组件的资源 id 建议以 View 的缩写作为前缀。常用缩写参考书籍。 3.【推荐】图片根据其分辨率,放在不同屏幕密度的 drawable 目录下管理,否则可能在低密度设备上导致内存占用增加,又可能在高密度设备上导致图片显示不够清晰。 Android 基本组件 4.【推荐】Activity#onSaveInstanceState()方法不是 Activity 生命周期方法,也不保证一定会被调用。它是用来在 Activity 被意外销毁时保存 UI 状态的,只能用于保存临时性数据,例如 UI 控件的属性等,不能跟数据的持久化存储混为一谈。持久化存储应该在 Activity#onPause()/onStop()中实行。 5.【强制】避免在 Service#onStartCommand()/onBind()方法中执行耗时操作(因为是在主线程),如果确实有需求,应改用 IntentService 或采用其他异步机制完成。 6.【强制】避免在 BroadcastReceiver#onReceive()中执行耗时操作,如果有耗时工作,应该创建 IntentService 完成,而不应该在 BroadcastReceiver 内创建子线程去做。 7.【推荐】 添 加 Fragment 时,确保 FragmentTransaction#commit() 在Activity#onPostResume()或者 FragmentActivity#onResumeFragments()内调用。不要随意使用 FragmentTransaction#commitAllowingStateLoss()来代替,任何commitAllowingStateLoss()的使用必须经过 code review,确保无负面影响。 8.【推荐】对于只用于应用内的广播,优先使用 LocalBroadcastManager 来进行注册和发送,LocalBroadcastManager 安全性更好,同时拥有更高的运行效率。 9.【强制】Activity或者Fragment中动态注册BroadCastReceiver时,registerReceiver()和 unregisterReceiver()要成对出现。 UI 与布局 10.【强制】布局中不得不使用 ViewGroup 多重嵌套时,不要使用 LinearLayout 嵌套,改用 RelativeLayout,可以有效降低嵌套数。要找到那些多余的 View(增加渲染延迟的 view),可以用 Android Studio Monitor里的 Hierarchy Viewer 工具,可视化的查看所有的 view。 11.【推荐】在 Activity 中显示对话框或弹出浮层时,尽量使用 DialogFragment,而非Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。 12.【推荐】文本大小使用单位 dp,View 大小使用单位 dp。对于 TextView,如果在文字大小确定的情况下推荐使用 wrap_content 布局避免出现文字显示不全的适配问题。之所以文本大小也推荐使用 dp 而非 sp,因为 sp 是 Android 早期推荐使用的,但其实 sp 不仅和 dp 一样受屏幕密度的影响,还受到系统设置里字体大小的影响。 13.【强制】禁止在设计布局时多次为子 View 和父 View 设置同样背景进而造成页面过度绘制,推荐将不需要显示的布局进行及时隐藏。 14.【推荐】在需要时刻刷新某一区域的组件时,建议通过以下方式避免引发全局 layout刷新: 1) 设置固定的 View 大小的宽高,如倒计时组件等; 2) 调用 View 的 layout 方法修改位置,如弹幕组件等; 3) 通过修改 Canvas 位置并且调用 invalidate(int l, int t, int r, int b)等方式限定刷新区域; 4) 通过设置一个是否允许requestLayout的变量,然后重写控件的requestlayout、onSizeChanged 方法,判断控件的大小没有改变的情况下,当进入requestLayout 的时候,直接返回而不调用 super 的 requestLayout 方法。 进程、线程与消息通信 15.【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。其他会堆积大量的请求或创建大量的线程; 16.【推荐】 禁止在多进程之间用 SharedPreferences 共享数据,虽然可以(MODE_MULTI_PROCESS),但官方已不推荐。 文件和数据库 17.【推荐】 SharedPreference 提交数据时,尽量使用 Editor#apply() ,而非Editor#commit()。一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使用 Editor#commit()。 18.【强制】多线程操作写入数据库时,需要使用事务,以免出现同步问题。 19.【强制】执行 SQL 语句时,应使用 SQLiteDatabase#insert()、update()、delete(),不要使用 SQLiteDatabase#execSQL(),以免 SQL 注入风险。 Bitmap、Drawable 与动画 20.【强制】png 图片使用 TinyPNG 或者类似工具压缩处理,减少包体积。 21.【强制】在 Activity#onPause()或 Activity#onStop()回调中,关闭当前 activity 正在执行的的动画。 22.【推荐】在动画或者其他异步任务结束时,应该考虑回调时刻的环境是否还支持业务处理。例如 Activity 的 onStop()函数已经执行,且在该函数中主动释放了资源,此时回调中如果不做判断就会空指针崩溃。 23.【推荐】使用 inBitmap 重复利用内存空间,避免重复开辟新内存。 24.【推荐】谨慎使用 gif 图片,注意限制每个页面允许同时播放的 gif 图片,以及单个gif 图片的大小。 安全 25.【强制】禁止使用常量初始化矢量参数构建 IvParameterSpec,建议 IV 通过随机方式产生。 26.【强制】将 android:allowbackup 属性必须设置为 false,阻止应用数据被导出。 27.【强制】所有的 Android 基本组件(Activity、Service、BroadcastReceiver、ContentProvider 等)都不应在没有严格权限控制的情况下,将 android:exported 设置为 true。
阿里云证书
总结
除了学习 《Android开发规范》一书之外,还应该:1.学习《Java开发手册》;2.在Android Studio安装规约检查插件,不要忽视插件提示的问题,规范的代码习惯能大大减少不必要的bug。打好基础才能走得更远。
参考链接
《阿里巴巴Java开发手册v1.4.0(详尽版)》
《阿里巴巴Android开发规范》
Android规约检查插件