抱歉,这个问题听起来很基础。我有一个具有异步网络回调的Activity。用户离开 Activity 后可以执行回调。

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

我可以在回调中使用isFinishing()来确保仅在不破坏Activity的情况下才执行我的逻辑吗?

更具体地说,即使调用了isFinishing()之后,对于通过调用finish()销毁的Activity,onDestroy()是否返回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()
但我似乎无法得出这个特定问题的答案。

最佳答案

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

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

07-27 23:40