Activity是和我们打交道最多的组件,基本上App的每个界面都是Activity组成,或者由Activity搭载而成的
Activity
Activity跟我们人一样,也有着其生老病死的过程,我们称之为生命周期
生命周期
官网的生命周期图onCreate(Bundle savedInstanceState)
- 调用时机:Activity初次创建时
- 可执行操作:
- 通过Bundle恢复因Activity意外重建的数据
- 加载布局资源
- 初始化View,实例化变量
onStart()
- 调用时机:Activity可见时,处于Started状态
- 可执行操作:
- 注册BroadCastReceiver监控UI的变化
- 非耗时操作:onStart()会很快的执行完毕,进入onResume()
onResume()
- 调用时机:Activity进入前台,可与应用交互,进入Resumed状态,Activity处于栈顶
- 可执行操作:
- 初始化应在onPause()中释放的资源
onPause()
- 调用时机:离开前台,不可交互(即不能对界面进行点击,或点击没反应),如打开半透明的Activity
- 可执行操作:
- 释放系统资源
- 停止动画
- 处理传感器Gps
- 其它耗时短的操作
onStop()
- 调用时机:Activity对用户不可见,进入Stoped状态
- 可执行操作:
- 保存数据到数据库
- 释放一些在不可见状态下无用的资源
onDestory()
- 调用时机:Activity调用finish(),或因配置更改系统暂时销毁Activity时
- 可执行操作:
- 释放onStop()中未释放的资源
onRestart()
- 调用时机:Activity停止后再次启动时调用该方法
Tips
onPause()不能做耗时操作的原因:onPause和onResume可能会经常被调用
只有执行完onPause才会进入下一个方法(onResume或者onStop)
所以一切为了避免因卡在onPause方法而影响到Activity的交互体验
- 来自官网的原话
Activity中的回调
以ABCDEF代替Activity的六大生命周期状态,A对应onCreate,以此类推
在Activity各个回调中进行打印log,结果如下
单Activity启动及其他操作下的回调
打开 Activity:
onCreate->onStart->onResume
点击 Home键回桌面:
onPause->onStop->onSaveInstanceState
再次打开 Activity
onRestart->onStart->onResume
按 Back键关闭 Activity
onPause->onStop->onDestory
打开Activity(竖屏显示)然后旋转手机(横屏显示):
竖屏:
onCreate->onStart->onResume
旋转手机到横屏:
onPause->onStop->onSaveIntanceState->onDestory->onCreate->onStart->onRestoreInstanceState->onResume
Tips:
- 这里onSaveIntanceState和onRestoreInstanceState是为了恢复因配置改变(如横竖屏幕切换显示,或其他意外事件重建Activity)的Activity数据
- 在Manifest文件中为Activity添加android:configChanges="orientation|screenSize"属性,Activity就不会因为横竖屏幕切换而重建Activity
由一个Activity到另一个Activity
打开 First Activity:
First中的回调:onCreate->onStart->onResume
在 First中打开正常的 Secend Activity:
First:onPause-> Seceond:onCreate->onStart->onResume-> First:onStop->onSaveInstanceState
关闭 Second:
Second:onPause-> First:onRestart>onStart->onResume-> Second:onStop->onDestory
关闭 First:
First:onPause->onStop->onDestory
锁屏然后点亮屏幕
锁屏:
onPause->onSaveInstance->onStop
再次点亮:
onRestart->onStart->onResume
由普通Activity A到透明Activity或主题@style/Base.Theme.AppCompat.Light.Dialog的Activity B
打开透明 Activity或 Dialog
A:onPause-> B:onCreate->onStart->onResume
Back回 A
B:onPause-> A:onResume-> B:onStop->onDestory
透明主题和Dialog主题配置
<style name="Theme.Transparent" parent="Base.Theme.AppCompat">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
<activity
android:name=".lesson4.Dialog"
android:theme="@style/Base.Theme.AppCompat.Light.Dialog">
</activity>
<activity
android:name=".lesson4.Transparency"
android:theme="@style/Theme.Transparent">
</activity>
Tips:经多次log打印,发现onSaveInstanceState调用时机在onPause之后,在onStop前,后,或同时调用
网友评论