Android 四大组件中让我们产生最直观的感受的,还是 Activity。因为其重要性,网上已经有太多的例子,这里作此记录以加深印象。
首先我们看谷歌官方给定的一张生命周期图片:
一般情况下, Activity 经历的完整的生命周期为:
onCreate → onStart → onResume → onPause → onStop → onDestory
其中对于用户可见的部分为 onStart 调用之后, onStop 调用之前,其它时刻用户不可见。
其中用户可操作的部分为 onResume 调用之后, onPause 调用之前,其它时候用户不可操作。
一般情况下 onStart/onStop 对 与 onResume/onPause 对可以混用,但如果用户启动的一个新的 activity 是一个透明的 activity 或者并不能完全覆盖当前 activity 时, 当前 activity 不会调用 onStop, 当新的 activity 结束时, 本 activity 不会调用 onStart, 这里需要根据具体情况在不同的地方做相应处理。
根据上述内容,以及流程图,可以很清晰地看出单个 activity 是如何工作的,但是每个应用都不可能只有一个 activity, 每个应用又是如何去处理这些 activities 的呢?
那么再看一下多个 activity 是如何启动的。
在这里,我们封装一个简单的 BaseActivity:
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener{
private static List<AppCompatActivity> activityList = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getInfoView());
activityList.add(this);
log("onCreate");
log("activities: " + activityList.toString());
}
@Override
protected void onStart() {
super.onStart();
log("onStart");
}
@Override
protected void onResume() {
super.onResume();
log("onResume");
}
@Override
protected void onPause() {
super.onPause();
log("onPause");
}
@Override
protected void onStop() {
super.onStop();
log("onStop");
}
@Override
protected void onRestart() {
super.onRestart();
log("onRestart");
}
@Override
protected void onDestroy() {
super.onDestroy();
activityList.remove(this);
log("onDestroy");
log("activities: " + activityList.toString());
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
log("onSaveInstanceState");
}
private View getInfoView(){
TextView textView = new TextView(this);
textView.setText(this.getClass().getName());
textView.setGravity(Gravity.CENTER);
textView.setOnClickListener(this);
return textView;
}
public void log(@NonNull String msg){
Log.e(this.getClass().getSimpleName(), msg);
}
}
让 MainActivity, 以及 SecondActivity 继承 BaseActivity
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
super.log("Click");
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
}
public class SecondActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
super.log("Click");
finish();
}
}
启动 MainActivity 后单击 TextView 启动 SecondActivity 之后 再单击 TextView 后,产生了下面的一系列的日志:
可以看到,在 MainActivity 时 click 后,首先 MainActivity 运行 Pause, 然后开始 SecondActivity 的 create start resume 过程,当 SecondActivity Resume 之后 MainActivity 就不可见了,这时候 MainActivity 对应 Stop 了。
而在 SecondActivity 中单击 stop 之后 SecondActivity 首先 pause 然后让 MainActivity 显示出来,然后继续执行 SecondActivity 的销毁流程。
在不对 ams 进行深入分析的情况下,以上便是此次记录全部内容了。