Activity生命周期可分为两部分,一个是典型情况下的生命周期,两一个是异常情况下的生命周期。典型的情况为:有用户参与的情况下activity所经历的生命周期,异常情况为:activity被系统回收或者当前设备的Configuration发生改变到时activity被销毁。
概念介绍:
一、典型情况下的生命周期分析。
该情况下的生命周期有七个,分别是:
1) onCreate(),表示activity被创建,这是生命周期的第一个方法,一般用来初始化工作。初始化所需要的数据和布局资源等等。
2) onRestart(),表示activity被重新启动,一般当前activity从不可见变为可见状态时调用。比如用户按下home键切换到桌面,或者打开新的activity之后用户有返回到该activity,
3) onStart(),表示activity正被启动,该activity已经可见,但是还没有出现在前台,还无法和用户进行交互。只是我们肉眼看不见该activity而已。
4) onResume(),表示该activity已经出现并且我们肉眼已经可以看见。
5) onPause(),表示activity正在停止。
6) onStop(),表示activity即将停止,可以做一些稍微重量级的回收工作,但不能进行耗时操作。
7) onDestroy(),表示activity即将被销毁,这是activity生命周期的最后的一个回调。我们可以进行回收工作和一些必要的资源释放。
Activity的生命周期图如下:
针对与上图分为如下几种情况:
1) 当一个特定的Activity首次启动时,回调方法如下:onCreate -> onStart -> onResume。
2) 当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause -> onStop。有一种特出情况,就是当Activity采用了透明主题时,当前Activity将不会回调onStop。
3) 当用户再次回到原Activity时 方法回调如下:onRestart -> onStart -> onResume。
4) 当back键回退时方法调用如下:onPause -> onStop -> onDestroy。
提出Activity的问题:
假设Activity为A,用户再打开一个ActivityB,那么B的onResume和A的onPause那个先执行。
在启动Activity的请求会有Instrumentation来处理,然后通过Binder向AMS(ActivityManagerService)发送请求。AMS维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。在ActivityStack中resumeTopActivityInnerLocked方法中有源码表明,在新的Activity启动之前栈顶的Activity需要先onPause后,新的Activity才能启动,所以A先onPause然后B在onResume。
我们写一个简单的例子来验证一下,demo源码如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private String tag = "MainActivity ------ ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,ActivityB.class);
startActivity(intent);
}
});
Log.e(tag,"onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(tag,"onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.e(tag,"onPause");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(tag,"onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(tag,"onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(tag,"onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.e(tag,"onStop");
}
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
/**
* Created by lwp940118 on 2016/10/22.
*/
public class ActivityB extends Activity{
private String tag = "ActivityB ------ ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activvityb);
Log.e(tag,"onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(tag,"onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.e(tag,"onPause");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(tag,"onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(tag,"onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(tag,"onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.e(tag,"onStop");
}
}
demo的Log打印截图如下:
二、异常情况下的上面周期分析
1) 资源相关的系统配置发生改变导致Activity被杀死并重新创建。比如手机现在处于竖屏状态,突然变为横屏状态,在默认的情况下,系统配置将发生改变,Activity就会被销毁并且重新创建。我们也可以选择阻止系统创建Activity。当系统配置发生变化后Activity会被其销毁,其onPause、onStop、onDestroy均会被调用,由于Activity为异常终止的则系统会调用onSaveInstanceState来保存当前的Activity状态,当Activity被重新创建之后系统调用onRestoreInstanceState并把Activity销毁时的onSaveInstanceState方法所保存的Bundle对象座位参数传递给onRestoreInstanceState和onCreate方法来恢复数据和Activity的状态。
2) 资源内存不足导致优先级底的Activity被杀死。Activity按照优先级高低可以分为一下三种情况:
(1) 前台Activity—正在和用户交互的Activity优先级最高
(2) 可见但非前台的Activity — 比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户进行交互。
(3) 后台Activity— 已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会根据优先级高低去杀死Activity,并在后序通过onSaveInstanceState、onRestoreInstanceState方法来存储和恢复数据。如果一个进程中没有四大组件子啊执行,那么这个进程很快就会被杀死。所以后天工作不适合脱离四大组件,一般都是将后台工作放在Service中并保证有一定的优先级。这样就不容易被杀死。
demo下载地址:(http://download.csdn.net/detail/qq_30000411/9661130)
Activity的启动模式将在以后推出。