Activity是安卓的四大组件之一,对于新手来说,可以把Activity理解为一个屏幕界面。比如QQ,打开QQ,首先会看到欢迎页,欢迎页之后是登录界面,输入账号密码登录之后点登录,进入联系人界面。。。。。。这其中的欢迎页,登录界面,联系人界面等等可见的界面都是一个个独立的Activity。
Activity中提供了以下几个方法来控制Activity的生命周期,这些方法全部由安卓系统根据用户的交互来自行调用
onCreate()
在Activity创建时调用onStart()
在Activity刚打开时调用onResume()
在Activity打开完毕之后调用onPause()
在Activity即将变成不可见的状态时(如打开了一个新的Activity时,按了返回键时,切到其他程序时,按了菜单键时等等)调用onStop()
在Activity已经进入不可见状态的时候调用onRestart()
在Activity由不可见状态再度打开时调用onDestroy()
在Activity已经进入不可见状态,且准备结束这个Activity时调用或者在程序执行了finish()
方法时也会调用
从字面意思可能不太好理解,下面通过代码和代码运行结果来解释
MainActivity.java1
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
69package com.example.ahtcfg24.activitydemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
/**
* 验证Activity的生命周期
*/
public class MainActivity extends Activity {
public static final String TAG = "第一个Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
Log.i("第一个Activity", "--->OnCreate");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
}
});
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "--->OnRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "--->OnStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "--->OnResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "--->OnPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "--->OnStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "--->OnDestroy");
}
}
Main2Activity.java1
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
65package com.example.ahtcfg24.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class Main2Activity extends Activity {
public static final String TAG = "第二个Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "--->OnRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "--->OnStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "--->OnResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "--->OnPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "--->OnStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "--->OnDestroy");
Toast.makeText(Main2Activity.this, "结束啦", Toast.LENGTH_SHORT).show();
}
}
activity_main.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#469bbb"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="打开第二个Activity"/>
</RelativeLayout>
activity_main2.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#bb5767"
tools:context="com.example.ahtcfg24.activitydemo.Main2Activity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个activity"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="调用finish方法"/>
</RelativeLayout>
通过AndroidStudio的logcat过滤info中的关键字—>,此时程序已经默认打开了,因此会出现三条记录,分别是onCreate(),onStart(),onResume()的打开记录,如图
然后读者可以点击按钮,按返回,按home键,切换到其他程序,退出程序等操作来看记录,结合记录,即可理解Activity的生命周期。
总结如下
- 打开一个Activity时,onCreate先创建一个Activity对象,然后onStart方法启动这个Activity,启动完毕后调用onResume,该Activity准备好与用户进行交互。
- 当用户打开一个新的Activity时,旧的Activity先执行onPause方法,然后新的Activity执行onCreate,onStart,onResume,接着旧的Activity执行onStop方法,当用户从第二个Activity返回到旧的Activity时,第二个Activity执行onPause,第一个Activity执行依次onRestart,onStart,onResume,第二个Activity再执行onStop方法,执行之后,第二个Activity再执行onDestroy方法销毁自身。这样只剩了第一个Activity。
- 当从第一个Activity切换到别的程序或按home键时,它也会依次执行onPause,onStop,但不会执行onDestroy,程序仍然在后台执行。
- 当再次进入程序时,就会执行onRestart,onStart,onResume
- 实际上,Android系统管理Activity是靠Activity栈来实现的,栈遵循先进后出原则,示意图如下:
当打开一个Activity时,这个Activity就会进栈,处于可见状态,当打开第二个Activity时,第一个Activity被压到栈底,处于不可见状态,而第二个Activity在最上面,处于可见状态,当按返回键时,第二个Activity就会被移除出栈,这样第一个Activity就又可见,而第二个已经出栈被销毁。
参考资料
#(本文系作者原创,转载请注明出处)