安卓四大组件之Activity的生命周期

Activity的生命周期

一. 返回栈介绍

       在Android中,一个应用可能包含了多个Activity,这些Activity是可以层叠的,当启动一个新的活动,这个新活动会覆盖在原活动之上,然后我们点击Back键或者调用finish()方法会摧毁最上面的活动,下面的一个活动就会重新显示出来。
       可以看出这和栈很相似,没错这就是栈。栈是一种后进先出的数据结构,在安卓中我们称之为返回栈(Back Stack),在默认情况下,当我们启动一个新的活动,它会在返回栈中入栈,并出去栈顶的位置。当我们点击Back键或者调用用finish()方法会摧毁一个Activity时,栈顶的活动就会出栈,此时前一个入栈的活动就会处于栈顶的位置,再次呈现给了用户。

二. 四种活动状态

  1. 运行状态:活动处于返回栈栈顶时,这是活动处于运行状态。
  2. 暂停状态:当一个活动不再处于栈顶的位置,但仍然可见时,这个活动就进入了暂停状态。并不是所有的活动都会占满整个屏幕,比如一个对话框活动只会占用屏幕中间及部分区域,此时处于对话框下面的的活动处于暂停状态,处于暂停状态的活动依然完全存活着。
  3. 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,该活动就进入了停止状态
  4. 摧毁状态:当一个活动从返回栈栈顶移除后该活动就处于销毁状态。

三. Activity生命周期的7个回调方法

  1. onCreate(): 在活动第一次被创建的时候调用,完成活动的初始化。
  2. onStart(): 这个方法在活动由不可见变为可见的时候调用。
  3. onResume(): 这个方法在活动准备好喝用户进行交互的时候调用。此时活动一定处于栈顶。
  4. onPause(): 这个方法在系统准备去启动或者恢复另一个活动的时候多用,通常会在改方法中释放掉一些消耗CPU的资源,以及保存一些关键数据。
  5. onStop(): 这个方法在活动完全不可见的时候调用。
  6. onDestroy(): 这个方法在活动被销毁之前调用。
  7. onRestart(): 这个活动由停止状态变为运行状态之前调用。

下面是一张完整的活动生命周期示意图:

  1. 完整生存期:onCreate()->onDestroy()方法之间所经历的,就是整个完整生存期。在onCreate()中完成各种初始化操作,onDestroy()方法中完成释放内存的操作。
  2. 可见生存期:onStart()->onStop()方法之间所经历的,就是可见生存期。onStart()方法中对资源进行加载,而在onStop()中对资源进行释放。
  3. 前台生存期:onResume()->onPause()方法之间所经历的,就是前台生存期。此时活动总是处于运行状态,。

四. 生命周期活动Demo

1. MainAcitvity代码:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.example.lifecycledemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

public static String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button normal_btn=(Button)findViewById(R.id.Normal);
Button dialog_btn=(Button)findViewById(R.id.Dialog);
normal_btn.setOnClickListener(new btn_event());
dialog_btn.setOnClickListener(new btn_event());
Log.d(TAG,"onCreate()");


}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart()");
}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume()");
}

@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause()");

}

@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop()");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"onRestart()");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestory()");
}

public class btn_event implements View.OnClickListener{
@Override
public void onClick(View view) {
switch (view.getId())
{
case R.id.Normal:
Intent intent1=new Intent(MainActivity.this,SecondActivity.class);
Log.d(TAG,"Click the button Go to normal activity");
startActivity(intent1);
break;
case R.id.Dialog:
Intent intent2=new Intent(MainActivity.this,ThirdActivity.class);
Log.d(TAG,"Click the button Go to dialog activity");
startActivity(intent2);
break;
default:
}
}
}

}


2. AndroidManifest.xml代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lifecycledemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
</activity>
<activity android:name=".ThirdActivity"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
</application>
</manifest>

3. 输出结果

  1. 红色部分:启动App,MainActivity处于栈顶位置,对用户可见。
  2. 紫色部分:点击跳转到一个一般的活动,这时候一般活动会完全覆盖住MainActivity,处于栈顶位置,此时MainActivity处于停止状态。
  3. 蓝色部分:按下返回键(Back),从NormalActivity跳转回MainActivity,此时摧毁NormalActivity,使MainActivity重新处于栈顶,调用onRestart重新激活MainActivity。
  4. 绿色部分:点击调转到一个对话的活动,这个时候对话活动只会占据屏幕的一小部分,所以MainActivity并不会处于停止状态,而是处于暂停状态,之后我们点击对话空白处,MainActivity又恢复运行状态,处于栈顶。
  5. 灰色部分:在MainActivity按下Back键,退出MainActivity,此时会摧毁MainActivity,退出应用程序。

以上是我对安卓生命周期的理解,因为第一次写blog,如有错误的地方欢迎大家指出,在下方评论!