活动的生命周期
活动是我们在进行Android开发过程中接触最多也必须接触的组件,掌握活动的生命周期对任何Android开发者来说都非常重要。
1. 返回栈
Android 是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack).在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下 Back 键或调用 finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
2.活动状态
- 运行状态: 当一个活动位于返回栈的栈顶时,这时活动就处于运行状态
- 暂停状态: 当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态
- 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收
- 销毁状态:当一个活动从返回栈中移除后就变成了销毁状态,系统最倾向于回收处于这种状态的活动,从而保证手机的内存充足
3. 经典生命周期流程图
4. 生命周期方法介绍
- onCreate():在首次创建 Activity 时调用。一般在这个方法中初始化Activity,比如:加载布局、绑定事件等。
- onStart():在 Activity 不可见变为可见时调用。
- onResume():在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层。
- onPause():在系统即将启动或者继续另一个 Activity 时调用。 可以在这个方法中释放掉占用CPU的资源并保存关键数据,但这个方法执行速度要快,不然会影响到新的栈顶活动的使用。
- onStop():在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity将其覆盖,就会调用此方法。
- onDestroy():在 Activity 被销毁前调用。 销毁之后活动将变为销毁状态。
- onRestart():在Activity被停止后再次启动时调用,而后会调用onStart方法。
5. 演示
5.1 重写7个生命周期方法
public class LifeCycleActivity extends AppCompatActivity {
private static final String TAG = "LifeCycleActivity";
@BindView(R.id.btn1)
Button btn1;
@BindView(R.id.btn2)
Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_lifecycle);
ButterKnife.bind(this);
}
@OnClick({R.id.btn1, R.id.btn2})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn1:
//启动一个完全覆盖当前活动的活动
startActivity(new Intent(this,CommonActivity.class));
break;
case R.id.btn2:
//启动一个对话框样式的活动,并不能完全覆盖当前活动
startActivity(new Intent(this,DialogActivity.class));
break;
}
}
@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, "onDestroy");
}
}
5.2 当活动第一次启动
08-25 18:11:05.185 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onCreate
08-25 18:11:05.413 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onStart
08-25 18:11:05.413 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onResume
5.2 当启动另一个活动完全覆盖当前活动时
08-25 18:13:32.747 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onPause
08-25 18:13:33.056 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onStop
5.3 当前活动被覆盖后重新启用时
08-25 18:14:37.925 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onRestart
08-25 18:14:37.927 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onStart
08-25 18:14:37.927 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onResume
5.4 当启动另一个活动但是没有被完全覆盖时
08-25 18:15:21.644 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onPause
5.4 当没有被完全覆盖然后重新启用时
08-25 18:15:37.744 5963-5963/qiyuan.lin.helloandroid D/LifeCycleActivity: onResume
kee