Activity

2016-08-24  本文已影响153人  xwp

20180314更新。
再次梳理了一遍,更详细清晰,见https://github.com/xwpeng/AndroidArt的chapter1

@Deprecated
本文是在读任玉刚的《Android开发艺术探索》上自己的总结,基础概念会略去,主要总结我觉得重要的地方,和书中内容测试后自己的见解。
也想着我以后关于Activity的一些问题都记录在这里。
Activity官方文档
github我测试的demo

正常生命周期注意点

  1. 要有前台/后台可见的概念。
    能与用户直接交互了是前台,能看见不能交互是后台。
    onPause使前台可见结束,onStop使后台可见结束。
    onStart使后台可见,onResume使可交互。
    前台可理解为可见且可交互。
  2. 对于activity优先级可以这样理解:
    可交互>可见不可交互>不可见未destroy
    对于资源回收或者说强杀,感觉粒度是进程而不是组件。
  3. onPause:可停止动画,保存一些数据,非耗时。
  4. onPause执行完新的Activity才能onResume 。所以不能在onPause中做重量(耗时操作),避免b要等待a onStop也尽量不做耗时操作,在onDestroy中做.有些生命周期的回调会受到前一个Activity阻塞。看具体情况去分析。
  5. 从a Activity到b Activity的时候,调onPause,onStop。
    如果b是透明的主题,a不会调onStop。
    透明activity底部弹窗样式:
    <style name="bottom_window_style" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    </style>
    熄屏先b的onPause,再a的onStop,再b的onStop。回来也是a优先,有阻塞效应。
  6. onRestart会调onStart。
  7. 注意熄屏,按Home的会触发回调。

Activity的销毁重建的回调

横竖屏Activity的销毁重建,内存不足被杀之类都属于Activity异常结束。我认为被杀可能没有机会走回调方法了,系统的结束清理整个进程的时间极短。

  1. onPause/onStop/onDestory会被调用,onSaveInstance会再onStop之前被调用。被重建的时候在onCreate和onRestoreInstance中取得保存的数据进行恢复。onRestoreInstance在onStart之后调用。官方文档建议onRestoreInstance恢复数据。oncrete中要判断非空
  2. 销毁重建的时候系统默认做恢复工作,比如输入文本内容,ListView滑动位置。是因为这些View中有onSaveInstance/onRestoreInstance方法。EditText继承自TextView。


    TextView中onSaveInstance

    流程:Activity调用onSaveInstance后委托Window保存数据,Window委托DecorView去保存数据,DecorView通知子元素保存数据。

  3. 不希望旋转android:screenOrientation="portrait"始终竖屏。
  4. 旋转时不希望销毁重建android:configChanges="orientation|screenSize",属性说明参考官方文档。
  5. 强制要求旋转(手机已配置禁止自动旋转)在onCreate中加上
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
  6. 按Home键或者启动新Activity仍然会单独触发onSaveInstanceState的调用。

启动模式与标记位

IntentFilter匹配规则总结

官方文档

如果三者都有,三个同时匹配成功IntenFilter才匹配成功。
intentfilter可以有多组,匹配任一组就能启动Activity。

code.png

相关拓展:Android应用程序的Activity启动过程简要介绍和学习计划

上一篇下一篇

猜你喜欢

热点阅读