管理生命周期
四个状态:
一、继续--->此Activity在前台且有焦点。(也叫运行)运行状态:onCreate()---onStart()---onResume()
二、暂停--->a.另一 Activity 在屏幕前台并具有焦点,此 Activity 仍可见(另一个 Activity 显示在此 Activity 上方,且另一Activity 部分透明或未覆盖整个屏幕);
b. 暂停的 Activity 处于完全活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接);
c. 内存极度不足时,可能会被系统终止。
暂停状态切换为运行状态:onPause()---onResume();
运行状态切换为暂停状态:onResume()---onPause();
注:onPause()失去焦点时调用,一般在此期间对一些未保存的数据进行持久化并停止其他需要耗费CPU的操作,同时不可进行耗时操作,否则会阻塞系统UI线程。
三、停止--->a.该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。
b.已停止的 Activity 同样仍处于活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接);
c.该 Activity对用户不可见,在他处需要内存时可能会被系统终止。
暂停状态切换为停止状态:onPause()---onStop();
停止状态切换为运行状态:onStop()---onRestart()---onStart()---onResume();
注:onStop()不可见时调用,此方法中可以进行广播的注销操作等。
四、销毁--->当activity处于暂停或者停止状态时,极有可能会被系统回收进行销毁状态。
停止状态到销毁状态分为两种情况:(1)由用户操作导致,则执行:onStop() -> onDestroy()。(2)由系统自动强制执行,则该Activity被强行结束。
注:onDestroy()是当Activity被销毁前调用,用户调用了finish()方法或者系统回收时可能调用。
七个生命周期
生命周期图谱
可见生命周期:在调用onStart()---onStop()之间,如在onStart()中注册一个广播,在onStop()中注销这个广播。
前台生命周期:在调用onResume()---onPause()之间,此时activity处于前台且有焦点,随时可以转入和转出如出现对话框,设备休眠,都会调用onPause()。由于此状态可 能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
七个生命周期中《是否能事后终止》:表示系统是否能在不执行另一行 Activity 代码的情况下,在方法返回后随时终止承载 Activity 的进程。onPause(),onStop(),onDestroy()这三个方法可以事后终止,在系统紧急情况下回收内存时可能会只执行onPause(),不执行onStop()和onDestroy()方法。所以可以在onPause()方法中可以持久化关键的数据,但必须不能做耗时的操作。
生命周期的例子:
1,activityA启动activityB:先走A的onPause()---再走B的oncreate()---onstart()--onResume 获取焦点后---最后走A的onSaveInstancestate()--A的onStop()。【启发:A的要存数据库的数据B要用,就在onPause()方法里处理】。
2,先操作1然后从B按返回键到A:B的onPause()---A的onRestart()---A的onStart()---A的onResume获取焦点后---B的onStop()---B的onDestroy();
3,activityA中启动Dialog(上下文Context用的是activityA):此时不走任何的生命周期,Dialog是activityA的一部分。如果用另一个activityB半透明处理,做成Dialog就会走如1.的生命周期啦。
4,Activity在前台有焦点时锁屏(Activity在前台有焦点时按Home键):onPause---onSaveInstanceState()---onStop();
开屏(无手势):onRestart()--onStart()--onResume();
开屏(有手势界面):onRestart()--onStart()--onResume()--onPause()--onSaveINstancestate()--onStop()--onRestart()--onStart()--onResume();出现了两次的获取焦点,原因就是有手势界面遮挡了activity。
注意:网上说锁屏后再开屏时会销毁当前的activity两次,重建两次,原因是横竖屏引起来的,需要设置的清单文件中activity里设 置android:configChanges="orientation|screenSize"。
用的4.4的手机测试的,我没有看到这个情况。我用6.0的小米也没有出现两次销毁和两次重建,只不过有手势的时候与无手势生命周期一样:onRestart()--onStart()--onResume();
保存activity状态
activity在暂停和停止状态时,仍然处于活动状态。当activity的配置发生改变或者内存回收时,会销毁activity进行重建,此时会执行以下方法:
onSaveInstanceState()(按Home键退到后台,锁屏等会执行此方法,按back键或调用finish()时来结束时不会执行此方法):来保存状态数据。
1,它有可能会在onStop()或者onPause()方法之前执行。
2,最好用此方法来保存activity的瞬态(UI的状态)数据,持久化的数据用onPause()来处理。
3,保存UI状态时,一定要给view添加上id,否则不会进行保存操作。
onRestoreInstancestate()和 onCreate() (重建activity时会执行onCreate()方法,判断bundle不为空时进行数据的还原):还原数据。
应用例子:处理配置变更(屏幕旋转,键盘的可用性,设置语言,设置字体等)会重建当然的activity,用上面的方法进行数据的保存,让用户无感觉的体验app的操作。
注意:有关(屏幕旋转,键盘的可用性,设置语言,设置字体等)也可以在清单文件中设置android:configChanges 来防止重建,会执行此onConfigurationChanged()在它里面来处理相关操作。
启动模式
“standard” :标准。
“singleTop” :栈顶复用,同一个栈内,处于栈顶的activity不再创建实例,但系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent。
“singleTask” :栈内复用,同一个栈内,已经有该activity实例,不创建实例,如activity实例在栈顶,不作处理,不在栈顶会将activity实例上面的所有activity清除栈,并让activity实例显示在栈顶。
“singleInstance”:单例,一个栈只有一个实例。
注意:standard和singleTop比较常用,其他不怎么用。
任务和返回栈
后进先出原则
概览屏幕
参考来源:
生命周期:https://developer.android.google.cn/guide/components/activities.html#Lifecycle
处理运行时的变更:https://developer.android.google.cn/guide/topics/resources/runtime-changes.html