在 Activity 的 onDestroy 方法里面调用 finish 会发生什么

本文探讨了一个在Activity的onDestroy方法中调用finish导致屏幕旋转后Activity自动关闭的问题。通过分析源码,揭示了在重建过程中,旧Activity对象的finish方法如何影响新创建的Activity。问题的关键在于同一个ActivityClientRecord和mToken值在销毁重建过程中的作用。
摘要由CSDN通过智能技术生成

发现这个奇怪问题的起因在于同事看了MVVM的相关文章,里面提到屏幕旋转时,Activity 销毁重建不会导致 ViewModel随着销毁而重建

于是,就在项目中写了测试代码来验证。然后就发现了一个诡异的问题,打开的界面旋转后自动关闭了!!后来断点调试发现是因为 onDestroy 走了两次,分析逻辑之后,还原了执行流程,如下代码所示:

Demo

    @Override
    protected void onDestroy() {
   
        super.onDestroy();
        // 由于历史原因,我们的项目里面出现了这样的代码(经过简化逻辑之后)。
        finish();
    }

那么问题就来了,Activity 在重建时,是创建了新的对象,为何旧的对象调用 finish 方法会将新创建的 Activity 对象给销毁?

查看 finish 的源码:

Activity

android.app.Activity#finish(int)

    private void finish(int finishTask) {
   
        // mParent 为空,走里面的逻辑
        if (mParent == null) {
   
            
            ...

            try {
   
                ...
                // 这里是最可疑的地方,AMS 是根据 mToken 的值去判断该 finish 哪个 Activity    
                if (ActivityManager.getService()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
   
                    mFinished = true;
                }
            } catch (RemoteException e) 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值