安卓学习之activity生命周期

每个Activity实例都有其生命周期。在生命周期内,Activity在运行、暂停、停止三种可见的状态间进行切换。

首先我们查看一下activity的生命周期图。
我们可以查看google的官方文档提供的API,学会查看API对我们的学习很有帮助。

  • 我们都下载了配置了android-sdk,我们打开sdk的下载环境,可以在里面找到API文档Documentation for Android SDK进行下载,下载完后可以在sdk的docs文件下打开index.html,这样我们就可以找到API文档,查找activity的讲解。
  • 我们也可以直接进入android的官网,找到开发者资源,查看API,找到Activity的讲解。

下面就让我们来看一下Activity的生命周期图:

生命周期图已经很详细的介绍了Activity的生命周期了。开始于onCreate,结束于onDestroy。下面我们通过代码的运行过程来再详细的了解一下Activity的生命周期。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

System.out.println("M on create");
}

@Override
protected void onStart() {
super.onStart();
System.out.println("M on start");
}

@Override
protected void onResume() {
super.onResume();
System.out.println("M on resume");
}

@Override
protected void onPause() {
super.onPause();
System.out.println("M on pause");
}

@Override
protected void onStop() {
super.onStope();
System.out.println("M on stop");
}

@Override
protected void onRestart() {
super.onRestart();
System.out.println("M on restart");
}

@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("M on destroy");
}
}
  • 当我们开启app进入页面,这时查看终端依次打印了M on start M on start M on resume,对照生命周期图,Activity运行。
  • 当我们再按home回到手机桌面时,这时查看终端依次打印了M on pause M on stop,对照生命周期图,Activity暂停并关闭变成了不可见状态。
  • 当我们再次打开app时,这时查看终端依次打印了M on restart M on start M on resume,对照生命周期图,Activity重新启动恢复变成可见状态。
  • 当我们按返回键退出app时,这时查看终端依次打印了M on pause M on stop M on destroy,对照生命周期图,Activity暂停不可见之后直接销毁了,这时生命周期就到此结束了。
  • 当我们再启动app时,这时又是一个新的生命周期的开始了。终端依次打印了M on start M on start M on resume
接下来我们看一下Activity在屏幕旋转时的生命周期。

我们通过终端可以看到依次打印M on start M on start M on resume M on pause M on stop M on destroy M on start M on start M on resume。可以看出屏幕旋转后,M就被销毁,重新创建了。这是因为旋转设备会改变设备配置,为了适配不同的配置,应用需要提供不同的备选资源。

最后我们再来看一下Activity在跳转中的生命周期

我们再新建一个Activity,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class AnotherActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_another);

System.out.println("A on create");
}

@Override
protected void onStart() {
super.onStart();
System.out.println("A on start");
}

@Override
protected void onResume() {
super.onResume();
System.out.println("A on resume");
}

@Override
protected void onPause() {
super.onPause();
System.out.println("A on pause");
}

@Override
protected void onStop() {
super.onStope();
System.out.println("A on stop");
}

@Override
protected void onRestart() {
super.onRestart();
System.out.println("A on restart");
}

@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("A on destroy");
}
}

我们在mainActivity中创建一个button,id为goToAnother,点击跳转到anohterActivity:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

System.out.println("M on create");

findViewById(R.id.goToAnother).setOnClickListener(new View.onClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, AnotherActivity.class));
}
});
}

...

}

当我们点击按钮跳转到another页面时,我们查看终端依次打印了M on pause A on create A on start A on resume M on stop,从这个打印顺序我们可以看出当M暂停后,A就开始创建启动显示了,当A显示后M才stop变成不可见状态,这也就是我们在安卓上切换页面看到的切换页面的效果。

【注】如果在这种情况下,M切换到A但是A透明的话,A出现时,M还是可见的。比如所A是一个dialog的弹出框,这时我们的终端打印情况为M on pause A on create A on start A on resume。这时M没有执行onStop,因为M还是可见的,所以M只是出于暂停状态。当我们关闭A后,M又会restart并resume恢复执行。