Android之Activity的生命周期
PS:写一发关于Activity的生命周期,也算是面试的重点内容.
学习内容:
1.Activity的生命周期
2.面对多种情况的时候Activity的生命周期
3.onSaveInstanceState()方法的调用
1.Activity的生命周期
Activity的生命周期是Android中需要掌握的重点部分..也就此简单的介绍一下..顺便自己也捋一捋概念上的东西..
返回栈的概念和流程图:
Android中Activity的管理是由一个栈区进行管理的.在默认情况下,我们每次启动一个新的Activity的时候.他都会在返回栈中入栈.并且处于栈顶的位置.而我们每次在退出一个Activity的时候,或者是使用finish函数的时候.当前的Activity会进行出栈操作.那么栈顶位置就成为了前一个Activity系统总是会将栈顶位置的Activity显示给用户.
这个流程图就是Activity的管理方式..
Activity的相关状态
i.运行状态
运行状态的Activity.运行状态的Activity一般都是直接与用户进行交互的Acticity.也是处于栈顶位置的Activity.系统一般情况下是不会回收这个Activity的.
ii.暂停状态
暂停状态的Activity不再处于栈顶位置,但是仍然处于可见状态的时候,这个Activity也就进入了暂停状态.这种的Activity还是挺常见的.一般我们在操作一个Activity的时候.比如说系统弹出了一个新的对话框.这个对话框属于一个新的Activity.但是这个新的Activity并没有完全的覆盖住了屏幕.那么原来的那个Activity这个时候就处于了暂停状态.暂停状态的Activity系统一版状态下也是不会主动去回收的.(虽然活动暂停,但是仍然处于可见状态.如果进行了回收,会使得用户的体验性差).但是并不代表任何情况下都不会被回收.
iii.停止状态
停止状态的Activity.停止状态的Activity也不再处于栈顶位置.并且已经完全不再可见了.虽然系统仍然保存着相应的状态和变量.但是一旦其他应用也需要使用内存的时候,那么处于停止状态下的Activity也就会被系统自动进行回收了.
iv.销毁状态
一般情况下Activity在栈区中被移除的时候,Activity也就进入了销毁状态.等待系统的回收,释放资源和内存.
Activity的生存周期
i.onCreate()方法.
这个方法在Activity在第一次被创建的时候进行调用.一些相关的初始化操作都在这个方法内部完成.
ii.OnDestory()
这个方法是与onCreate()方法是相互对应的.这个方法用于销毁Activity.释放资源.
这两个方法之间的Activity是一个完整的生存周期
iii.onStart()
这个方法使得Activity由不可见状态成为可见状态.
iv.onStop()
与onStart()方法形成对应关系.当活动完全不可见的时候进行调用.
这两个个方法之间的Activity是一个可见的生命周期
v.onResume()
这个方法表示当前的Activity已经可以与用户进行交互了.活动处于栈顶状态.
vi.onPause()
与onResume()方法形成对应关系.这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。(注:onPause()方法调用之后不一定会去调用onStop()方法.取决于新Activity的显示方式,在下面会做出解释).
这两个方法之间的Activity是一个前台生存周期,也就是说当前的Activity可以与用户进行交互.
vii.onRestart()
这个方法的调用是当Activity从停止状态到运行状态时需要调用的方法.
上一张流程图..
以上就是关于Activity的生命周期的一个简单的介绍..下面来看一看相关的实例.
2.面对多种情况下Activity的生命周期流程
当MainActivity被创建的时候方法的调用过程:
MainActivity的创建会调用的方法:
onCreate();
onStart();
onResume();
当我们点击第一个按钮的时候,开启一个新的Activity(我们称为Activity1).当Activity1被创建的时候方法的调用过程是这样的.
首先Activity1调用的方法如下:
Activity1的回调方法如下:
onCreate();
onStart();
onResume();
MainActivity的回调方法:
MainActivity被Activity1覆盖之后回调方法的调用
onPause();
onStop();
这时MainActivity已经执行了上面的一些方法..
当我们退出Activity1的时候.MainActivity的执行方法如下:
当我们退出Activity1.回到MainActivity的时候方法的调用
onRestart();
onStart();
onResume();
这里我们可以看到onCreate()方法就不会被执行了.这种情况的前提是我们手机的内存空间是充足的.
我们在来看另外一种情况,比如说我们开启了一个应用,然后进入了一个Activity界面中,然后我们这时点击了home键进行了退出操作,并且没有清理手机的内存.这个时候我们去玩手机游戏,并且这个手机游戏会占用相当多的内存空间.然后我们玩完之后,如果我们再次返回前一个我们开启的那个应用的时候,他仍然会显示那个Activity的页面.那么这个时候这个Activity又执行了哪些方法呢?
我们知道手游是相当耗费内存的.按照上面的那个流程图来看..如果其他有优先级的应用需要使用内存空间的时候,并且系统空间并不是很足的时候.就需要杀掉进程.释放那些已经不再显示的Activity.也就是处于onStop()状态的时候.因此当我们如果再次回到那个应用的Activity的界面的时候.就需要重新调用onCreate()方法对Activity进行重新创建.然后再去执行onStart().onResume()。
我们接着看上面的另外一种情况,就是我们去点击第二个按钮的时候,弹出的对话框Activity(这里称为Activity2).我们来看看这种情况.当我们点击第二个按钮的时候Activity2的回调方法过程.
Activity2的回调方法:
onCreate();
onStart();
onResume();
Activity2的创建仍然没有什么太大的区别..还是这三个方法的调用.那么我们来看看MainActivity的回到方法:
MainActivity的回调方法:
onPause();
这里我们可以看到MainActivity只是调用了一个方法.onPause()方法.并没有去调用onStop()方法了.因为MainActivity仍然处于一个可见的状态.虽然我们启动了一个新的Activity,但是Activity2并没有完全的覆盖MainActivity,因此MainActivity只需要去调用onPause()方法.当我们点击回退的时候,MainActivity只会去调用onResume()方法了.
3.onSaveInstanceState()方法
前面我们已经说过,当一个活动进入到了停止状态,是有可能被系统回收的。那么如果应用中有一个活动A,用户在活动A的基础上启动了活动B,活动A就进入了停止状态,这个时候由于系统内存不足,将活动A 回收掉了,然后用户按下Back 键返回活动A,会出现什么情况呢?其实还是会正常显示活动A的,只不过这时并不会执行onRestart()方法,而是会执行活动A的onCreate()方法,因为活动A 在这种情况下会被重新创建一次。
但是这样会导致的情况就是,这个新创建的Activity是无法保存用户上次输入的相关信息的.比如说,用户在一个文本框中输入了相关内容然后走了上面的情况.被回收之后,只能重新进行创建,那么原来用户在文本框中输入的相关内容也就不复存在了.这样就会使得用户的体验性较差.那么我们如何去记录用户上一次的操作的相关信息呢?那么就是使用onSaveInstanceState()方法了.
我们知道Activity创建的时候会调用onCreate()方法.onCreate()方法中存在一个Bundle对象.默认情况下,这个对象的数据是空的.但是如果我们需要保存上一次用户的相关操作,一些数据信息,那么就需要使用这个对象了.
我们只需要这样..
@Override protected void onSaveInstanceState(Bundle State) { super.onSaveInstanceState(outState); String data = "需要保存的数据"; State.putString("data_key", data); }
通过这个方法将数据信息进行保存,那么恢复的时候就可以这样..
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if (savedInstanceState != null) { String data = savedInstanceState.getString("data_key"); } //取出数据之后,在这里进行恢复. }
这样就可以通过使用这个方法保存上次用户输入的一些数据信息,如果在面对Activity需要重新创建的时候,将数据进行取出,然后重新赋给Activity这样就可以使得用户上次输入的数据会得以保存.使得Activity对用户的体验更加的良好,,