android四大组件的生命周期对于学习android开发的人来说是必学的知识啦,接下来的几天准备总结一下,首先从Activity的生命周期开始:
Activity类中有关生命周期的方法有一下几种:
(1)onCreate(): 当活动第一次启动的时候会触发该方法,可以在此完成活动的初始化工作,该方法有一个参数,该参数可以是null,也可以是之前调用onSaveInstanceState()方法保存的状态信息;
(2)onStart(): 触发该方法表示所属的活动将会展示给用户;
(3)onResume(): 当一个活动和用户交互的时候将会触发该方法;
(4)onPause(): 当一个正在运行的活动因为其他的活动需要前台运行的Activity转入后台运行的时候会触发该方法,这时候需要将活动的状态持久化;
(5)onStop(): 当一个活动不需要展示给用户的时候会触发该方法,如果内存紧张的话,Linux系统为了给新的活动预留更多的存储空间会直接结束该活动,所以保存状态信息的操作应该在onPause里面进行,因为你无法保证你的onStop方法是否会执行;
(6)onRestart(): 当处于暂停状态的活动再次展现给用户的时候会调用该方法;
(7)onDestroy(): 当活动销毁时触发该方法,和onStop方法一样,如果内存紧张的话,也不会执行该方法;
(8)onSaveInstanceState(): 系统调用该方法,允许活动保存之前的状态,比如一串字符串的光标所处位置,通常情况下不需要覆写该方法,在默认的实现中已经提供了自动保存活动所涉及的用户界面组件的所有状态信息;
下面根据不同的实例来进行Activity生命周期的分析:
注:以下所有实例的Activity1代码为:
public class Activity1 extends Activity{
public Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle);
System.out.println("Activity1----->onCreate");
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(Activity1.this, Activity2.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("Activity1----->onDestroy");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("Activity1----->onPause");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("Activity1----->onRestart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("Activity1----->onResume");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("Activity1----->onStart");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("Activity1----->onStop");
}
}
所有实例的Activity2代码为:
public class Activity2 extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle);
System.out.println("Activity2----->onCreate");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("Activity2----->onDestroy");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("Activity2----->onPause");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("Activity2----->onRestart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("Activity2----->onResume");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("Activity2----->onStart");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("Activity2----->onStop");
}
}
实例1:
启动程序进入Activity1,在Activity1文本框中输入文字,而后点击返回键,观察Logcat输出;
启动Activity1之后的输出:
Activity1----->onCreate
Activity1----->onStart
Activity1----->onResume
点击返回键之后新增输出:
Activity1----->onPause
Activity1----->onStop
Activity1----->onDestroy
实例2:
启动程序,进入Activity1,在Activity1文本框中输入文字,点击按钮进入Activity2,在Activity2中点击返回键,观察Logcat输出;
启动Activity1之后的输出:
Activity1----->onCreate
Activity1----->onStart
Activity1----->onResume
点击按钮跳转Activity2之后马上输出:
Activity1----->onPause
Activity2----->onCreate
Activity2----->onStart
Activity2----->onResume
Activity1----->onStop
注意,有可能有以下的输出:
Activity1----->onPause
Activity1----->onStop
Activity2----->onCreate
Activity2----->onStart
Activity2----->onResume
即Activity1----->onStop的出现位置可能会有变化;
在Activity2中点击返回键之后的输出:
Activity2----->onPause
Activity1----->onRestart
Activity1----->onStart
Activity1----->onResume
Activity2----->onStop
Activity2----->onDestroy
同时我们发现当我们从Activity2返回到Activity1界面之后,之前在Activity1界面文本编辑框中填充的信息仍然存在的,也就是说Activity1的状态信息得到了保存;
通过上面两个例子,我们先来总结一下:
(1)创建一个Activity的时候会首先执行onCreate方法,如果该Activity处于显示状态的话,会执行onStart方法,如果和用户发生交互的话,会执行onResume方法;
(2)当一个Activity从当前显示界面中消失之后并且这个Activity是Activity栈中的最后一个Activity的时候,会先后调用onPause、onStop、onDestroy方法来结束这个Activity并且有可能删除该Activity栈;
(3)当一个Activity从当前界面中消失但不是当前Activity栈中的最后一个Activity的话,他会先后调用onPause、onStop方法,但是不会调用onDestroy,如果下次从另一个Activity返回到该Activity的时候会直接执行onRestart、onStart来直接恢复该Activity就好,而不再需要重新调用onCreate;
实例3:
启动程序进入Activity1,然后按锁屏键,然后从锁屏界面返回到Activity1,查看Logcat输出;
启动Activity1之后的输出:
Activity1----->onCreate点击锁屏键之后新增的输出:
Activity1----->onPause
Activity1----->onStop
从锁屏状态返回到Activity1新增的输出:
Activity1----->onRestart
Activity1----->onStart
Activity1----->onResume
那么锁屏相当于和隐藏了Activity的效果了;
实例4:
启动程序进入Activity1,点击按钮以弹窗的形式显示Activity2,而后在Activity2中点击返回键,返回Activity1,查看Logcat输出;
首先先说下怎么以弹窗的形式显示Activity2,其实很简单只需要在AndroidManifest.xml文件的Activity2的Activity标签下添加android:theme="@android:style/Theme.Dialog"即可;
启动Activity1之后的输出:
Activity1----->onCreate点击按钮显示Activity2之后新增的输出:
Activity1----->onPause
Activity2----->onCreate
Activity2----->onStart
Activity2----->onResume
可以发现并没有调用onStop方法
在Activity2点击返回键之后新增的操作:
Activity2----->onPause
Activity1----->onResume
Activity2----->onStop
Activity2----->onDestroy
看到没有呢?直接连Activity1的onRestart和onStart方法也不会执行,直接就执行的onResume;
实例5:
启动程序,进入Activity1,点击按钮,打开一个AlertDialog,点击返回键,查看Logcat输出;
只需要将Activity1类的Button监听事件onClick方法块语句替换成:
new AlertDialog.Builder(Activity1.this).setTitle("测试").setPositiveButton("确定", null).show();即可
启动Activity1之后的输出:
Activity1----->onCreate点击按钮之后发现弹出了AlertDialog窗口,但是对于Activity1的生命周期并没什么影响,所以点击返回键之后也没什么影响了,这也就是说AlertDialog应该是属于Activity的内部界面的;