什么是Activity
在我们接触Android第一个四大组件就是activity,也是开发中遇到最最多的组件,Activity为用户提供了一个可视化交互的窗口,让用户实现各种点击和滑动操作,在开发过程中通过onCreate中setContentView(View)来为activity提供界面交互接口。在Android系统中是通过Activity任务栈来管理activity,Activity的创建到销毁有着自己的生命周期方法,接下来分析下Activity常规典型的生命周期:
Activity的四种状态
- Running:Activity处于活动状态,用户可以进行交互,用户点击或滑动屏幕会做出响应,是处于Activity栈顶的状态。
- Paused:表明Activity已经失去焦点或者被一个非全屏的Activity所覆盖,或者被一个全透明的Activity所覆盖进入栈顶,这些情况就会进入Paused状态。当在Paused状态时,会失去与用户交互的焦点,就是用户对该界面进行操作是没有反应的,并不是说整个Activity状态被销毁了,但Activity的信息状态和成员变量都还存在的;不过还有一种特殊情况,就是当系统内存紧张的情况,这个Activity会被回收。
- Stoped:当一个Activity被另外一个Activiy完全覆盖掉,被覆盖的Activity就会进入Stoped状态,此时用户不可见的;但其的信息状态和成员变量和Paused状态一样的依然是存在的。
- Killed:当Activity被系统回收,就是Killed状态,Activity所持有的信息和成员变量都是销毁不存在。
Paused与Stoped最大的区别就是,Paused是用户可见的状态,而Stoped是不可见状态。
Activity的生命周期
- Activity第一次启动:onCreate –> onStart–> onResume
- 当打开新的Activity或者按Home键返回桌面或灭屏:onPause –> onStop
- 当用户再次返回原Activity或者从桌面点击APP回到Activity:onRestart –> onStart –> onResume
- 当用户按back返回键:onPause –> onStop –> onDetroy
接下通过代码验证以上场景的activity生命周期的调用
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
/**
* activity正在创建中,生命周期中的第一个方法。
* 在这个方法中可以做一些初始化工作,比如setContentView加载布局及初始化所需数据
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate()");
}
/**
* activity正在启动中,这时activity是可见的,但还没有处于前台的位置,是无法和用户交互的。
*/
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart()");
}
/**
* activity已经可见了,并且出现在前台了开始活动了,用户可以操作屏幕会响应的。
* 与onStart方法相比,都是activity可见状态,但onStart是处于后台,而onResume是在前台的。
*/
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume()");
}
/**
*activity正在停止,一般情况下紧接着onStop会被调用
* 此时可以在此方法总做一些停止动画或数据存储工作,但不能太耗时
* 因为这会影响到新的activity的启动显示,旧的activity被执行完后,
* 新activity的onResume方法才会执行
*/
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause()");
}
/**
* activity即将停止,可以做一些资源释放工作,但不能太耗时
*/
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop()");
}
/**
* activity正在重新启动。一般情况下当前activity从不可见状态到可见状态时
* onRestart会被执行,这个情形下一般是用户行为所导致的,比如按Home键返回桌面
* 或启动一个新activity,这时当前的activity就是执行onPause和onStop方法
* 当用户又回到了这个activity时,就是调用onRestart
*/
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart()");
}
/**
* activity即将销毁,是activity生命周期中最后一个方法,
* 可以在里面做一些资源的回收释放工作。
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy()");
}
}
一、当第一次创建activity:从创建到运行状态(Running)
03-23 06:00:20.547 1891-1891/com.hzw.tapp I/MainActivity: onCreate()
03-23 06:00:20.598 1891-1891/com.hzw.tapp I/MainActivity: onStart()
03-23 06:00:20.599 1891-1891/com.hzw.tapp I/MainActivity: onResume()
从Log日志中可以看出,依次调用了onCreate –> onStart –> onResume方法,从Activity的创建到后台的启动再到前台焦点的获取。
二、当打开新的Activity或者按Home键返回桌面或灭屏:从可见状态(Running)到不可见状态(Stoped)
03-23 06:08:17.996 1891-1891/com.hzw.tapp I/MainActivity: onPause()
03-23 06:08:20.869 1891-1891/com.hzw.tapp I/MainActivity: onStop()
同样的从Log日志可以看出,在当前Activity打开新Activity或者按Home键返回桌面或灭屏情况下,Activity会依次调用onPause –> onStop;另外还有一种特殊情况,当新Activity为透明的时,此时只会调用onPause。这两种情况分别对应的Activity的状态变化是:Running –> Stoped;Running –>Paused。
三、当用户再次返回原Activity或者从桌面点击APP回到Activity:从Stoped到Running状态
03-23 06:58:58.104 1648-1648/com.hzw.tapp I/MainActivity: onRestart()
03-23 06:58:58.114 1648-1648/com.hzw.tapp I/MainActivity: onStart()
03-23 06:58:58.115 1648-1648/com.hzw.tapp I/MainActivity: onResume()
从Log日志可以看出,此时依次调用了onRestart –> onStart –>onResume
四、当用户按back返回键
03-23 07:03:19.717 1648-1648/com.hzw.tapp I/MainActivity: onPause()
03-23 07:03:21.545 1648-1648/com.hzw.tapp I/MainActivity: onStop()
03-23 07:03:21.546 1648-1648/com.hzw.tapp I/MainActivity: onDestroy()
从Log日志可以看出,当按back返回键时,Activity会进入销毁状态,此时会依次调用onPause –>
onStop –> onDestroy。
小结
当创建一个新Activity时,依次会调用onCreate、onStart、onResume,进入Running状态,而当Activity退入后台不可见状态时(在当前Activity启动一个新Activity或Home键返回桌面),依次会调用onPause、onStop,进入Stoped状态;接着返回原Activity或者从桌面点击回到Activity,依次会调用onRestart、onStart、onResume,此时由Stoped变为Running状态;最后按back返回键退出Activity进行销毁,此时会调用onPause、onStop、onDestroy。到此Activity整个典型的生命周期流程已经完成了,相对比较清晰了。下一篇将围绕Activity异常情况的生命周期分析。