Activity生命周期
先来看下经典的生命周期流程图:
从这个经典的流程图中可以看出,Activity的生命周期可以分为这样几个流程:
- 当启动一个Activity时,首先会执行onCreate–>onStart–>onResume。此时该Activity就处于运行状态
- 在启动的Activity中,你的需求有可能允许弹出一个popupwindow或者dialog,此时会调用onPause方法,暂停当前Activity的执行。
- 当我们在popupwindow或者dialog中执行完毕需要dismiss,此时Activity将会重新在前台工作,此时会调用onResume方法,Activity进入运行状态。
- 当跳转到其他的Activity时,当前Activity为不可见。此时会调用onPause–>onStop方法。
- 我们知道,调用onPause或者onStop方法后,当前Activity处于不可交互的状态,若系统内存不足时,则会销毁当前Activity时,再次启动时,会重新调用onCreate–>onStart–>onResume
- 如Activity调用onStop方法,此时Activity处于停止状态时,想要重新启动Activity,此时系统会调用onRestart–>onstart–>onResume方法。
- 销毁一个Activity:onStop–>onDestroy
以上是Activity的基本生命周期流程,往往有时候还需要其他的生命周期方法:如onSaveInstanceState、onWindowFocusChanged等方法。
下面通过代码来进一步体会Activity的生命周期。
public class MainActivity extends Activity implements View.OnClickListener{
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("ActivityLifeCycle","onCreate");
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
Log.i("ActivityLifeCycle","onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.i("ActivityLifeCycle", "onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.i("ActivityLifeCycle", "onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.i("ActivityLifeCycle", "onStop()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("ActivityLifeCycle", "onRestart()");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i("ActivityLifeCycle", "onSaveInstanceState()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("ActivityLifeCycle", "onDestroy()");
}
@Override
public void onClick(View v) {
if (v.getId()==R.id.btn){
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
startActivity(intent);
}
}
}
当首次启动程序时
我们可以看到依次执行了onCreate–>onStart–>onResume,此时Activity处于运行状态。
当我们锁屏后
执行了onPause–>onSaveInstanceState–>onStop方法,此时Activity处于不可见状态。注意:onSaveInstanceState是在onPause方法之后执行。
当我们解锁后
执行了onRestart–>onStart–>onResume,此时Activity重新处于运行状态了。
Activity启动模式
Activity的启动模式有这四种方式:Standard、SingleTop、SingleTask、SingleInstance。
Standard:标准模式,若不设置任何启动模式,默认为standard模式。当为Standard模式时,一调用startActivity都会产生一个Activity的实例。
SingleTop:如果已经有一个实例在Activity的栈顶,就不创建新的实例,而是调用Activity中的newInstance()方法。如果不位于栈顶,就创建新的实例。
SingleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
SingleInstance: