阿里云出的阿里巴巴Android开发手册,这几天看了下个人感觉不错,里面的知识点虽然都很基础,但是都是开发中很实用和很容易碰到的问题。
主要讲了命名规范、组件使用注意、安全等问题,有兴趣的同学可以下载看看,下载地址:
https://edu.aliyun.com/course/813
还可以在阿里云的网站上参加阿里云认证考试,需要交9.9参加考试,考试比较简单,只要看看开发手册基本都能过,考完后会有证书,这证书虽然没有什么含金量,就当是对知识的一个复习。
相关比较重要知识点总结:
四大组件:
1.Activity 间通过隐式 Intent 的跳转,在发出 Intent 之前必须通过 resolveActivity 检查,避免找不到合适的调用组件
2.避免在 Service#onStartCommand()/onBind()方法中执行耗时操作,如果确 实有需求,应改用 IntentService 或采用其他异步机制完成。
3.避免在 BroadcastReceiver#onReceive()中执行耗时操作,如果有耗时工作, 应该创建 IntentService 完成,而不应该在 BroadcastReceiver 内创建子线程去做。
4.添 加 Fragment 时 , 确 保 FragmentTransaction#commit() 在 Activity#onPostResume()或者 FragmentActivity#onResumeFragments()内调用。 不要随意使用 FragmentTransaction#commitAllowingStateLoss()来代替,任何 commitAllowingStateLoss()的使用必须经过 code review,确保无负面影响。
5.不要在 Activity#onDestroy()内执行释放资源的工作,例如一些工作线程的 销毁和停止,因为 onDestroy()执行的时机可能较晚。可根据实际需要,在 Activity#onPause()/onStop()中结合 isFinishing()的判断来执行。
6.不要在 Android 的 Application 对象中缓存数据。基础组件之间的数据共享
请使用 Intent 等机制,也可使用 SharedPreferences 等数据持久化机制。
UI:
1.在 Activity 中显示对话框或弹出浮层时,尽量使用 DialogFragment,而非 Dialog/AlertDialog,这样便于随 Activity 生命周期管理对话框/弹出浮层的生命周期。
2.禁止在设计布局时多次设置子 view 和父 view 中为同样的背景造成页面过 度绘制,推荐将不需要显示的布局进行及时隐藏。
3.在需要时刻刷新某一区域的组件时,建议通过以下方式避免引发全局 layout 刷新:
1) 设置固定的 view 大小的高宽,如倒计时组件等;
2) 调用 view 的 layout 方式修改位置,如弹幕组件等;
3) 通过修改canvas位置并且调用invalidate(int l,int t,int r,int b)等方式限定刷新区域。
4)通过设置一个是否允许 requestLayout 的变量,然后重写控件的 requestlayout、
onSizeChanged 方法,判断控件的大小没有改变的情况下,当进入requestLayout的时候,直接
返回而不调用super的requestLayout方法。
4.不能使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew;因为这 样会把 ListView 的所有 Item 都加载到内存中,要消耗巨大的内存和 cpu 去绘制图 面。
进程、线程和消息通信
1.在 Application 的业务初始化代码加入进程判断,确保只在自己需要的进程 初始化。特别是后台进程减少不必要的业务初始化。
2.禁止在多进程之间用 SharedPreferences 共享数据,虽然可以 (MODE_MULTI_PROCESS),但官方已不推荐。
文件与数据库
1.SharedPreference 提交数据时,尽量使用 Editor#apply(),而非 Editor#commit()。一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使 用 Editor#commit()。
Editor#apply() 是先写入内存然后异步写入磁盘
Editor#commit()直接写入磁盘
2.多线程操作写入数据库时,需要使用事务,以免出现同步问题
Bitmap、Drawable与动画
在有强依赖 onAnimationEnd 回调的交互时,如动画播放完毕才能操作页
面,onAnimationEnd 可能会因各种异常没被回调(参考: https://stackoverflow.com/questions/5474923/onanimationend-is-not-getting-calle d-onanimationstart-works-fine ), 建 议 加 上 超 时 保 护 或 通 过 postDelay 替 代
onAnimationEnd。
安全
1.使用 PendingIntent 时,禁止使用空 intent,同时禁止使用隐式 Intent
2.META-INF 目录中不能包含如.apk,.odex,.so 等敏感文件,该文件夹没有经 过签名,容易被恶意替换。
3.阻止 webview 通过 file:schema 方式访问本地敏感数据。
4.使用 Android 的 AES/DES/DESede 加密算法时,不要使用默认的加密模式 ECB,应显示指定使用 CBC 或 CFB 加密模式。
5.AndroidAPP在HTTPS通信中,验证策略需要改成严格模式。说明:Android APP 在 HTTPS 通信中,使用 ALLOW_ALL_HOSTNAME_VERIFIER,表示允许和 所有的 HOST 建立 SSL 通信,这会存在中间人攻击的风险,最终导致敏感信息可能 会被劫持,以及其他形式的攻击。
6.Android WebView 组件加载网页发生证书认证错误时,采用默认的处理方法
handler.cancel(),停止加载问题页面。