Activity的生命周期
1. 返回栈(Back Stack):
- Android是使用Task(任务)来管理活动的。一个任务就是一组存放在栈里的活动的集合,这个栈就被称为返回栈。
- 栈是一种后进先出的数据结构。在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下 Back 键或调用 finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
2. 活动状态
- 运行状态:当一个活动位于返回栈的栈顶时。
- 暂停状态:当一个活动不再处于栈顶位置,但仍可见时。比如:Dialog后的Activity。
- 停止状态:当一个活动不再处于栈顶位置,并且完全不可见时。
- 销毁状态:当一个活动从返回栈中移除后。
3. 七个生命周期回调方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//活动第一次被创建时调用
//在这里完成Activity的初始化操作,比如:加载布局、绑定事件等
}
@Override
protected void onStart() {
super.onStart();
//在活动有由不可见变为可见是调用
//在这里对资源进行加载
}
@Override
protected void onResume() {
super.onResume();
//在活动已经准备好和用户进行交互的时候调用,此时的活动一定位于栈顶状态,并且处于运行状态
}
@Override
protected void onPause() {
super.onPause();
//在系统准备去启动或者恢复另一个Activity时调用
}
@Override
protected void onStop() {
super.onStop();
//在活动完全不可见的时候调用(如果新Activity是一个Dialog,则不会被调用)
//在这里对资源进行释放
}
@Override
protected void onRestart() {
super.onRestart();
//在活动由停止状态变为运行状态之前调用
}
@Override
protected void onDestroy() {
super.onDestroy();
//在活动被销毁之前被调用
//在这里完成内存释放等操作
}
}
- 常见生命周期场景
// Activity被创建
onActivityCreated: com.mny.androidbasic.MainActivity
onActivityStarted: com.mny.androidbasic.MainActivity
onActivityResumed: com.mny.androidbasic.MainActivity
// 屏幕翻转
onActivityPaused: com.mny.androidbasic.MainActivity
onActivityStopped: com.mny.androidbasic.MainActivity
onActivitySaveInstanceState: com.mny.androidbasic.MainActivity
onActivityDestroyed: com.mny.androidbasic.MainActivity
onActivityCreated: com.mny.androidbasic.MainActivity
onActivityStarted: com.mny.androidbasic.MainActivity
onActivityResumed: com.mny.androidbasic.MainActivity
// 跳转
onActivityPaused: com.mny.androidbasic.MainActivity
onActivityCreated: com.mny.androidbasic.anim.AnimActivity
onActivityStarted: com.mny.androidbasic.anim.AnimActivity
onActivityResumed: com.mny.androidbasic.anim.AnimActivity
onActivityStopped: com.mny.androidbasic.MainActivity
onActivitySaveInstanceState: com.mny.androidbasic.MainActivity
// Finish
onActivityPaused: com.mny.androidbasic.anim.AnimActivity
onActivityStarted: com.mny.androidbasic.MainActivity
onActivityResumed: com.mny.androidbasic.MainActivity
onActivityStopped: com.mny.androidbasic.anim.AnimActivity
onActivityDestroyed: com.mny.androidbasic.anim.AnimActivity
// 按 Home 键
onActivityPaused: com.mny.androidbasic.MainActivity
onActivityStopped: com.mny.androidbasic.MainActivity
onActivitySaveInstanceState: com.mny.androidbasic.MainActivity
// 从 Home 键回来
onActivityStarted: com.mny.androidbasic.MainActivity
onActivityResumed: com.mny.androidbasic.MainActivity
4. Activity被回收前的数据保存
- Activity中提供了
onSaveInstanceState()回调方法,用于在Activity被回收之前调用,以保存一些临时数据。在该回调方法中用Bundle对象来存储数据。然后在onCreate()方法中完成恢复。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
Activity的启动模式
设置方式:
- 在
AndroidManifest中对应的Activity标签中添加android:launchMode="启动模式名称" - 通过
Intent设置标志位
| 标志位 | 说明 |
|---|---|
FLAG_ACTIVITY_SINGLE_TOP |
即 SingleTop
|
FLAG_ACTIVITY_NEW_TASK |
即 SingleTask
|
FLAG_ACTIVITY_CLEAR_TOP |
所有位于其上层的 Activity 都要移除,SingleTask模式默认具有此标记效果 |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS |
具有该标记的 Activity 不会出现在历史 Activity 的列表中,即无法通过历史列表回到该 Activity 上 |
1. standard(标准模式)
-
Activity默认的启动模式。 - 每次启动都会创建该
Activity的一个新的实例而不在乎这个Activity的实例在该任务栈中是否已经存在。
2. singleTop(栈顶复用模式)
- 对于使用该模式的Activity,系统在启动该Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,而不会再创建新的Activity实例。
3. singleTask(栈内复用模式)
- 对于使用该模式的Activity,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
4. singleInstance
- 对于使用该模式的Activity会启用一个新的返回栈来管理这个Activity,用于解决共享Activity实例的问题。
参考
《第一行代码》--郭霖