Android学习笔记之Activity

管理生命周期

四个状态:

一、继续--->此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()方法或者系统回收时可能调用。

七个生命周期

生命周期图谱

Android学习笔记之Activity

可见生命周期:在调用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