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

本文深入探讨了Android中finish()方法的执行机制,解释了在onCreate()方法中调用finish()后,为何后续代码仍会执行,以及Activity的生命周期如何受到影响。通过源码解析,揭示了finish()方法背后的原理。

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

源码注释对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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值