Android - isFinishing() 的值会在 Activity 被销毁后保持为真吗?

Posted

技术标签:

【中文标题】Android - isFinishing() 的值会在 Activity 被销毁后保持为真吗?【英文标题】:Android - Will the value of isFinishing() remain true after an Activity has been destroyed? 【发布时间】:2017-01-05 09:41:15 【问题描述】:

如果这个问题听起来非常基础,我们深表歉意。我有一个具有异步网络回调的Activity。回调可以在用户离开 Activity 后执行。

作为检查,我想使用isFinishing()(我不能使用isDestroyed(),因为我的最低API 级别是16 而不是isDestroyed() 要求的17)。

我可以在回调中使用isFinishing() 来确保我的逻辑仅在 Activity 未被销毁时执行吗?

更具体地说,即使在调用onDestroy() 之后,通过调用finish() 销毁的Activity,isFinishing() 是否返回true?

我还查看了源代码。这里是isFinishing()

    public boolean isFinishing() 
        return mFinished;
    

这里是finish(),其中变量设置为true:

   /**
     * Finishes the current activity and specifies whether to remove the task associated with this
     * activity.
     */
    private void finish(boolean finishTask) 
        if (mParent == null) 
            int resultCode;
            Intent resultData;
            synchronized (this) 
                resultCode = mResultCode;
                resultData = mResultData;
            
            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
            try 
                if (resultData != null) 
                    resultData.prepareToLeaveProcess();
                
                if (ActivityManagerNative.getDefault()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) 
                    mFinished = true;
                
             catch (RemoteException e) 
                // Empty
            
         else 
            mParent.finishFromChild(this);
        
    

    /**
     * Call this when your activity is done and should be closed.  The
     * ActivityResult is propagated back to whoever launched you via
     * onActivityResult().
     */
    public void finish() 
        finish(false);
    

我也看过Understanding of isFinishing() 但我似乎无法得出这个特定问题的答案。

【问题讨论】:

同***.com/questions/5227071/… 我在帖子中提到了这一点,但我似乎无法回答我的问题。 “更具体地说,即使在调用 onDestroy() 之后,通过调用 finish() 销毁的 Activity 的 isFinishing() 是否返回 true ?” 有关 isFinishing ***.com/questions/5227071/… 的更多详细信息请参阅此主题 【参考方案1】:

您的问题可能与任何答案一样好,因为Activity.isFinishing() 的javadoc 没有指定已经销毁的Activity 的返回值。但是,从source 来看,似乎完全没有混淆命名的mFinished(由isFinishing() 使用)从未设置为false(初始化除外),因此一旦设置为@ 987654328@ 将始终保持该值。话虽如此,mFinished 是包私有的,所以理论上另一个类可能正在修改该值。在实践中,我认为如果Activity 正在完成或已经完成,假设isFinishing() 返回true 是安全的!

换句话说,isFinishing() == isFinishing() || isDestroyed()

【讨论】:

【参考方案2】:

我可以确认我将 (isFinishing() || isDestroyed) 替换为 isFinishing() 并从 Glide 获得了一些 IllegalArgumentExceptions 错误 You cannot start a load for a destroyed activity。不是完美的证据,但足以让我相信,至少在某些平台/设备上,两者并不相同。

【讨论】:

以上是关于Android - isFinishing() 的值会在 Activity 被销毁后保持为真吗?的主要内容,如果未能解决你的问题,请参考以下文章

在android中检测主页按钮按下

Android之Dialog提示Unable to add window -- token is not valid; is your activity running?

Android之Dialog提示Unable to add window -- token is not valid; is your activity running?

硅谷社交2--欢迎页面

如何在屏幕旋转期间处理 AsyncTask?

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )