【问题标题】:Android - Will the value of isFinishing() remain true after an Activity has been destroyed?Android - isFinishing() 的值会在 Activity 被销毁后保持为真吗?
【发布时间】: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() 但我似乎无法得出这个特定问题的答案。

【问题讨论】:

标签: android activity-lifecycle


【解决方案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。不是完美的证据,但足以让我相信,至少在某些平台/设备上,两者并不相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      相关资源
      最近更新 更多