先附上activity生命周期:
试验内容:一个MainActivity(继承自BaseMainActivity)调用SecondActivity(继承自BaseSecondActivity),并back返回MainActivity的顺序。
MainActivity代码如下(其他Activity完全相似):
public class MainActivity extends BaseMainActivity {
private Out a = new Out("MainActivity before static");
static{
Log.i("test", "MainActivity static part");
}
private Out b = new Out("MainActivity after static");
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("test", "MainActivity oncreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
Log.i("test", "MainActivity onstart");
super.onStart();
}
@Override
protected void onResume() {
Log.i("test", "MainActivity onresume");
super.onResume();
}
@Override
protected void onRestart() {
Log.i("test","MainActivity onrestart");
super.onRestart();
}
@Override
protected void onDestroy() {
Log.i("test","MainActivity ondestroy");
super.onDestroy();
}
@Override
protected void onStop() {
Log.i("test","MainActivity onstop");
super.onStop();
}
@Override
protected void onPause() {
Log.i("test", "MainActivity onpause");
super.onPause();
}
@Override
public void onActivityReenter(int resultCode, Intent data) {
Log.i("test", "MainActivity reenter");
super.onActivityReenter(resultCode, data);
}
}
Out代码如下:
public class Out {
public Out(String s){
Log.i("test",s);
}
}
情况一:在mainfest中只注册MainActivity和SecondActivity。
试验结果:
点击进入:
I/test: BaseMainActivity static part
I/test: MainActivity static part
I/test: BaseMainActivity before static
I/test: BaseMainActivity after static
I/test: MainActivity before static
I/test: MainActivity after static
I/test: MainActivity oncreate
I/test: BaseMainActivity oncreate
I/test: MainActivity onstart
I/test: BaseMainActivity onstart
I/test: MainActivity onresume
I/test: BaseMainActivity onresume
//从试验结果看出,调用顺序如下:
//1.首先向上追溯到最上层class,完成它的static初始化(函数和成员变量),逐步向下,完成至自身static块的初始化。
//2.完成最上层的non–static初始化,并调用其构造函数,完成后转向下一层class。
//3.之后完成该Activity的生命周期调用,因为每个生命周期后都跟有super调用父Activity的相应生命周期,所以结果如上。
点击click:
I/test: MainActivity onclick
I/test: MainActivity onpause
I/test: BaseMainActivity onpause
I/test: BaseSecondActivity static part
I/test: SecondActivity static part
I/test: BaseSecondActivity before static
I/test: BaseSecondActivity after static
I/test: SecondActivity before static
I/test: SecondActivity after static
I/test: SecondActivity oncreate
I/test: BaseSecondActivity oncreate
I/test: SecondActivity onstart
I/test: BaseSecondActivity onstart
I/test: SecondActivity onresume
I/test: BaseSecondActivity onresume
I/test: MainActivity onstop
I/test: BaseMainActivity onstop
//跟上面逻辑一样
点击back:
I/test: SecondActivity onpause
I/test: BaseSecondActivity onpause
I/test: MainActivity onrestart
I/test: BaseMainActivity onrestart
I/test: MainActivity onstart
I/test: BaseMainActivity onstart
I/test: MainActivity onresume
I/test: BaseMainActivity onresume
I/test: SecondActivity onstop
I/test: BaseSecondActivity onstop
I/test: SecondActivity ondestroy
I/test: BaseSecondActivity ondestroy
再点击click:
I/test: MainActivity onclick
I/test: MainActivity onpause
I/test: BaseMainActivity onpause
I/test: BaseSecondActivity before static
I/test: BaseSecondActivity after static
I/test: SecondActivity before static
I/test: SecondActivity after static
I/test: SecondActivity oncreate
I/test: BaseSecondActivity oncreate
I/test: SecondActivity onstart
I/test: BaseSecondActivity onstart
I/test: SecondActivity onresume
I/test: BaseSecondActivity onresume
I/test: MainActivity onstop
I/test: BaseMainActivity onstop
该调用顺序中并没有出现onActivityReenter方法的调用。参考onActivityReenter方法的官方解释:
/**
* Called when an activity you launched with an activity transition exposes this
* Activity through a returning activity transition, giving you the resultCode
* and any additional data from it. This method will only be called if the activity
* set a result code other than {@link #RESULT_CANCELED} and it supports activity
* transitions with {@link Window#FEATURE_ACTIVITY_TRANSITIONS}.
*
* <p>The purpose of this function is to let the called Activity send a hint about
* its state so that this underlying Activity can prepare to be exposed. A call to
* this method does not guarantee that the called Activity has or will be exiting soon.
* It only indicates that it will expose this Activity's Window and it has
* some data to pass to prepare it.</p>
*
* @param resultCode The integer result code returned by the child activity
* through its setResult().
* @param data An Intent, which can return result data to the caller
* (various data can be attached to Intent "extras").
*/
它的调用跟transition有关,如果没有transition,应该就不会调用。
情况二:在mainfest中全部注册。
试验结果和情况一完全一样。
情况三:当activity是抽象的activity时,该activity不能够在manifest中注册,会报错。
MainActivity代码如下:
public class MainActivity extends BaseMainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("test", "MainActivity oncreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
Log.i("test", "MainActivity onstart");
super.onStart();
}
@Override
protected void onResume() {
Log.i("test", "MainActivity onresume");
super.onResume();
}
public void initLayoutId(){
Log.i("test", "main initlayoutid");
}
public void initView(){
Log.i("test","main initView");
}
}
BaseMainActivity代码:
public abstract class BaseMainActivity extends Activity{
abstract void initLayoutId();
abstract void initView();
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("test", "BaseMainActivity oncreate");
initLayoutId();
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
Log.i("test", "BaseMainActivity onstart");
initView();
super.onStart();
}
@Override
protected void onResume() {
Log.i("test", "BaseMainActivity onresume");
super.onResume();
}
}
刚进入:
I/test: MainActivity oncreate
I/test: BaseMainActivity oncreate
I/test: main initlayoutid
I/test: MainActivity onstart
I/test: BaseMainActivity onstart
I/test: main initView
I/test: MainActivity onresume
I/test: BaseMainActivity onresume
点击click:
I/test: MainActivity onclick
I/test: SecondActivity oncreate
I/test: BaseSecondActivity oncreate
I/test: second initlayoutid
I/test: SecondActivity onstart
I/test: BaseSecondActivity onstart
I/test: second initView
I/test: SecondActivity onresume
I/test: BaseSecondActivity onresume
点击back:
I/test: MainActivity onstart
I/test: BaseMainActivity onstart
I/test: main initView
I/test: MainActivity onresume
I/test: BaseMainActivity onresume
再点击click:
I/test: MainActivity onclick
I/test: SecondActivity oncreate
I/test: BaseSecondActivity oncreate
I/test: second initlayoutid
I/test: SecondActivity onstart
I/test: BaseSecondActivity onstart
I/test: second initView
I/test: SecondActivity onresume
I/test: BaseSecondActivity onresume
以上用法为关于抽象activity的常用方式。记住!