关于继承的Activity中初始化及生命周期被调用的顺序

本文探讨了Android中继承Activity的初始化及生命周期调用顺序。通过实验展示了MainActivity(继承自BaseMainActivity)启动SecondActivity(继承自BaseSecondActivity)并在不同情况下返回MainActivity的顺序。实验结果显示,onActivityReenter方法的调用与transition有关,未在所有情况下触发。同时,文章提到了抽象Activity的使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先附上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的常用方式。记住!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值