本篇是搜集关于Android的仅以提醒作用的条例,见名知意。 相关注意事项推荐阅读《阿里巴巴的安卓手册》
条例
-
onActivityResult()发生在onResume()之前
-
onFinishInflate()在加载完成xml后执行:只有当自定义View,通过在XML中创建时才会调用。不从xml布局文件中解析的话,比如通过new方式创建,则不会执行该方法;
-
foreach使用前需要判空
-
overridependingtransition()进入动画需要再startActivity之后,退出动画需要再finish后
-
view的调用过程:构造方法->onFinishInflate->onSizeChanged->onDraw
-
如果用户finish()方法结束了Activity,则不会调用onSaveInstanceState()
-
getIntrinsicWidth()和getIntrinsicHeight()
-
canvas的好处之一是旋转画布后旋转回来,以达到图像绘制部分的旋转,不用对坐标点进行转置
-
用transient关键字标记的成员变量不参与序列化过程
-
滑动冲突处理:可以根据滑动距离和水平方向形成的夹角;或者根绝水平和竖直方向滑动的距离差;或者两个方向上的速度差等
-
getParent().requestDisallowInterceptTouchEvent(false)请求父亲不要阻挡儿子
-
getSuggestedMinimumWidth的逻辑:View如果没有背景,那么返回android:minWidth这个属性指定的值,这个值可以为0;如果设置了背景,则返回背景的最小宽度和minWidth中的较大值。
-
Fragment的动画setCustomAnimations()对于反射取FragmentManager中置儿子为null的是有问题的,建议用Fragment自己的onCreateAnimation()函数
-
OOM:尽量避免使用帧动画,使用的话应尽量避免使用过多尺寸较大的图片
-
内存泄露:属性动画中的无限循环动画需要在Activity退出的时候及时停止,否则将导致Activity无法释放而造成内存泄露。view动画不存在这个问题;
-
当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent
-
launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下处理请求数据的onCreate方法,而是调用onNewIntent方法
-
DiffUtil.DiffResult可以使RecyclerView不添加相同的条目,即部分更新
-
RelativeLayout如果cast到FrameLayout是不必要的,view就可以
-
自定义view,一定是this(context)、this(context,attr)、super(context, attr, defaltStyle),注意需要手动调init()或者this(context, null)与this(context,attr,0)
-
小心使用ArrayList的subList [a, b) ,对生成对新列表的改变会改变原列表结构,可以在新列表前加final来阻止后续更改
-
RequestLayout() , Invalidate() , layout()的区别
-
如果需要addView的话,那么使用getLayoutParams是没用的,因为这个你自己新建的一个View,没有与父容器有任何关联。所以LayoutParams也需要你自己创建
-
contentInsetStart消除ToolBar在自定义布局中的左部白边
-
JSONObject中的getString()和optString()方法的区别在于optString()不报错
-
@Transient标志则不入数据库
-
overridePendingTransition转移
-
由于Activity的TaskMode不同所以onActivityResult在Activity的生命周期中执行的先后也是不同的,更有onCreate不会执行的情况,所以onActivityResult有时候提前结束收不到result。
-
调用startActivityForResult后onActivityResult立刻响应,而返回当前页时onActivityResult不响应主要是launchMode的问题:
- 第一种:当resultCode==0时,Activity的launchMode必须设置为”singleTask”或者singleInstance,否则就会出错。这是因为从Task的角度看,Android认为不同Task之间的Activity是不能传递数据的,所以不能使用NEW_TASK标识,但还是要调用forResult方法。
- 第二种:当resultCode!=0时,Activity的launchMode必须为standard(删除launchMode属性默认为standard模式),原因同上。
- 只有第一层fragment会收到onActivityResult
- 重写onBackPressed() 自定义回退事件可以避免按Back键自动设置resultCode为RESULT_CANCELED的问题
- requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,每个区分开不同的requestCode
- resultCode 如果B子模块可能有几种不同的结果返回,可以用setResut(int resultCode, Intent intent)予以识别区分
-
@IntDef
注解自定义了一个 OrientationType 注解,用于防治用户随意设置数值。
使用@IntRange
方法将行列数限制在一个较合理的范围内。@IntDef({VERTICAL, HORIZONTAL}) public @interface OrientationType {} // 滚动类型 @Orient