Android条例-警醒向tips

本文汇总了Android开发中的重要条例和注意事项,包括生命周期、UI绘制、内存管理、数据处理等多个方面。如onActivityResult()发生在onResume()之前,onFinishInflate()在加载XML后执行,以及滑动冲突处理、Fragment动画问题、内存泄露风险等。提醒开发者在实践中需谨慎处理这些问题,以优化应用性能和用户体验。
摘要由CSDN通过智能技术生成

本篇是搜集关于Android的仅以提醒作用的条例,见名知意。 相关注意事项推荐阅读《阿里巴巴的安卓手册》

条例

  1. onActivityResult()发生在onResume()之前

  2. onFinishInflate()在加载完成xml后执行:只有当自定义View,通过在XML中创建时才会调用。不从xml布局文件中解析的话,比如通过new方式创建,则不会执行该方法;

  3. foreach使用前需要判空

  4. overridependingtransition()进入动画需要再startActivity之后,退出动画需要再finish后

  5. view的调用过程:构造方法->onFinishInflate->onSizeChanged->onDraw

  6. 如果用户finish()方法结束了Activity,则不会调用onSaveInstanceState()

  7. getIntrinsicWidth()和getIntrinsicHeight()

  8. canvas的好处之一是旋转画布后旋转回来,以达到图像绘制部分的旋转,不用对坐标点进行转置

  9. 用transient关键字标记的成员变量不参与序列化过程

  10. 滑动冲突处理:可以根据滑动距离和水平方向形成的夹角;或者根绝水平和竖直方向滑动的距离差;或者两个方向上的速度差等

  11. getParent().requestDisallowInterceptTouchEvent(false)请求父亲不要阻挡儿子

  12. getSuggestedMinimumWidth的逻辑:View如果没有背景,那么返回android:minWidth这个属性指定的值,这个值可以为0;如果设置了背景,则返回背景的最小宽度和minWidth中的较大值。

  13. Fragment的动画setCustomAnimations()对于反射取FragmentManager中置儿子为null的是有问题的,建议用Fragment自己的onCreateAnimation()函数

  14. OOM:尽量避免使用帧动画,使用的话应尽量避免使用过多尺寸较大的图片

  15. 内存泄露:属性动画中的无限循环动画需要在Activity退出的时候及时停止,否则将导致Activity无法释放而造成内存泄露。view动画不存在这个问题;

  16. 当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent

  17. launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下处理请求数据的onCreate方法,而是调用onNewIntent方法

  18. DiffUtil.DiffResult可以使RecyclerView不添加相同的条目,即部分更新

  19. RelativeLayout如果cast到FrameLayout是不必要的,view就可以

  20. 自定义view,一定是this(context)、this(context,attr)、super(context, attr, defaltStyle),注意需要手动调init()或者this(context, null)与this(context,attr,0)

  21. 小心使用ArrayList的subList [a, b) ,对生成对新列表的改变会改变原列表结构,可以在新列表前加final来阻止后续更改

  22. RequestLayout() , Invalidate() , layout()的区别

  23. 如果需要addView的话,那么使用getLayoutParams是没用的,因为这个你自己新建的一个View,没有与父容器有任何关联。所以LayoutParams也需要你自己创建

  24. contentInsetStart消除ToolBar在自定义布局中的左部白边

  25. JSONObject中的getString()和optString()方法的区别在于optString()不报错

  26. @Transient标志则不入数据库

  27. overridePendingTransition转移

  28. 由于Activity的TaskMode不同所以onActivityResult在Activity的生命周期中执行的先后也是不同的,更有onCreate不会执行的情况,所以onActivityResult有时候提前结束收不到result。

  29. 调用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)予以识别区分
  30. @IntDef 注解自定义了一个 OrientationType 注解,用于防治用户随意设置数值。
    使用 @IntRange 方法将行列数限制在一个较合理的范围内。

    @IntDef({VERTICAL, HORIZONTAL})
    public @interface OrientationType {}            // 滚动类型
    @Orient
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值