安卓调用finish()后代码仍将继续执行?

源码注释对finish()方法的介绍是:当你的活动结束并且应该结束时请调用该函数
调用finish()方法可注销当前活动,那么在该活动中finish()之后的代码是否还将执行?

测试:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("test 1");
        finish();
        System.out.println("test 2");        
    }

输出结果:

test 1
test 2

可见调用finish()方法后代码将继续执行,那么为什么会产生这样的结果?
从生命周期上来看,在onCreate()中调用finish()方法,则执行的生命周期方法顺序为:
onCreate()→onDestroy();但是值得注意的是,调用finish()之后并不会立即执行Activity的onDestroy()方法,finish()方法仅仅是将当前栈顶活动移除,上一个活动回到栈顶位置,类似back键;所以很有可能出现的情况是:执行finish()后,当前活动的onDestroy()还没来得及执行,而上一个活动(返回到栈顶的活动)的onResume()方法已经开始执行了。

查看finish()相关源码后,你会知道:
经过层层调用,ApplicationThread.scheduleDestroyActivity方法会被调用,这个方法会完成对Activity的销毁工作,并且会回调Activity.onDestroy()方法。所以我们知道了调用finish()方法会导致对Acitivity的销毁,从而导致Activity.onDestroy()被回调。

我们在onCreate()方法中调用了finish()方法,那么由于此时主线程正处于对H.CREATE_ACTIVITY消息的处理中,所以暂时无法处理H.DESTROY_ACTIVITY消息,只有当主线程处理完前一个消息了,才会着手处理H_DESTROY_ACTIVITY消息。因此,我们调用finish()方法后,onDestroy()往往并不会被立即调用,但是我们可以通过isFinishing()方法来判断Activity是否处于销毁状态。

注:更多finish()源码解析可参见一位大佬博客:(https://www.cnblogs.com/absfree/p/5547384.html)

发布了18 篇原创文章 · 获赞 43 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42194695/article/details/89683297