一、学会查看帮助文档
在Android SDK目录下有个docs文件夹,打开文件夹,找到里面的index.html文件,双击,即打开帮助文档。
(可在帮助文档中找到Activity的生命周期图)
二、Android是如何管理Activity的
Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也称作返回栈(Back Stack)。
我们知道,栈是一种后进先出的数据结构,所以,默认下,我们启动一个新的活动,它会在返回栈中入栈,并处于栈顶的位置,当我们调用finish()方法或者按下Back键去销毁一个活动时,处于栈顶的活动就会出栈,前一个活动就会重新处于栈顶的位置。
系统总是会显示处于栈顶的活用给用户。
三、Activity状态
每个Activity在其生命周期最多可能会有4种状态。
1.运行状态
此时活动处于返回栈的栈顶。
2.暂停状态
此时活动不再处于栈顶,但仍然可见。
3.停止状态
此时活动不再处于栈顶,并且完全不可见。
4.销毁状态
此时活动从返回栈中移除了。
三、Activity的生命周期
从上面Activity的生命周期图可以看出:
Activity类中有7个回调方法,覆盖了Activity生命周期的每一个环节。
接下来我们用一个简单的程序来理解这7个方法:
创建一个项目ActivityLifeCycle,除了MainActivity.java再New两个新的Activity,分别为:NormalAty.java、DialogAty.java
从名字可以看出,一个是普通的Activity,一个是对话框式的Activity。
在三个Activity重写以下方法,并加上相应的语句:
例如:MainActivity.java中:System.out.println("Main onCreat");
NormalAty.java中:System.out.println("Normal onCreat");
Dialog.java中:System.out.println("Dialog onCreat");
以下以Dialog.java为例:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog_aty);
System.out.println("Dialog onCreat");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("Dialog onStart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("Dialog onResume");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("Dialog onPause");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("Dialog onStop");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("Dialog onRestart");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("Dialog onDestroy");
}
(注:以下按钮均未调用finish()方法)
MainActivity.java页面:
NormalAty.java页面
DialogAaty.java页面
1.打开ActivityLifeCycle这个App,观察logcat的打印日志
可以看出MainActivity第一次创建时会一次执行onCreat()、onStart()、onResume()方法。
1.1按下Back键,观察日志
可以看出一个活动从创建到销毁,依次执行了一个完整的生命周期,也即是:
1.2.点击START NORMAL ACTIVITY按钮
此时NormalActivity来到前台(栈顶),MainActivity不再可见,但是没有被销毁。
1.2.1.点击BACK按钮
此时返回到MainActivity,NoramlActivity不再可见,但是没有被销毁。
注意:没有调用restart()方法。
1.2.2.按下Back键
此时返回到MainActivity,NoramlActivity被销毁。
1.3.点击START DIALOG ACTIVITY按钮
此时DialogActivity来到前台(栈顶),MainActivity暂停,且依然可见。
1.3.1点击Back键
此时DialogActivity被销毁,返回MainActivity
由上面的例子知道:
(1)onCreat():
这个方法会在活动第一次创建的时候调用,并在这个活动中完成初始化操作,例如加载布局,绑定事件。
(2)onStart():
这个方法在活动由不可见变为可见的时候调用。
(3)onResume():
这个方法在活动准备好显示给用户时调用,此时的活动一定处于栈顶,并且处于运行状态。
(4)onPause():
这个方法在系统准备启动或者回复另一个活动的时候调用。
(5)onStop():
这个方法在活动完全不可见的时候调用。
(6)onDestroy():
这个方法在活动被销毁时调用,之后该活动的状态遍为销毁状态。
(7)onRestart():
这个活动由停止状态(onStop())变为运行状态之前调用,也就是活动被重新启动了。
四、Activity被回收了怎么办
相关的方法:
① onSaveInstanceState(Bundle outState)
当一个活动进入到了停止状态,是有可能被系统回收的。
比如:当用户从活动A进入到了活动B,此时活动A就进入了停止状态,这个时候手机内存不足,将A回收掉了,然后按下Back键返回活动A,会出现什么情况呢?
此时依旧会正常启动活动A,只不过不是执行了onRestart()方法,因为活动A被回收掉的时候已经执行了onDestroy()方法,所以此时系统重新创建一次活动A,也就是执行活动A的onCreat()方法。
如果第一次打开活动A的时候,在其输入框中输入了数字,然后启动其他活动,当按下Back键返回活动A 的时候,输入框的数字都没了,因为后面的活动A是重新创建的。
上面所说的这种情况是很影响用户体验的。
因此Activity中提供了一个onSaveInstanceState()
回调方法,这个方法可以保证在活动被回收之前一定会被调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。
① onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列方法用于保存数据,比如putString()方法保存字符串,putInt()方法保存整型数据等等。
putString(String key,String value);
putInt(String key,int value);
可以看出每个保存方法都需要传入两个参数:
第一个参数是键(也是数据的名字),用于后面从Bundle中取值;
第二个参数是真正要保存的内容,也就是数据。
②我们在saveInstanceState()方法中保存完数据后,在哪里恢复呢?
我们仔细观察下可以发现,onCreat()
方法中也有一个Bundle类型的参数,这个参数一般情况下都是null,如果活动在回收之前有调用onSaveInstanceState()方法的话,这个数据就会带有之前所保存的数据,我们只需要再通过取值方法将数据取出即可。
使用Bundle来保存和取出数据跟在多个Activity中用Intent传递数据包很相似,后面会写到关于这方面的知识,这里记录的onSaveInstanceState()方法保存数据的知识只是很浅的,很深奥的我暂时也没弄懂,所以别喷我啦。
视频学习网址:【极客学院】http://www.jikexueyuan.com/course/666.html