如果这个问题听起来非常基本,请道歉.我有一个具有异步网络回调的Activity.用户离开Activity后可以执行回调.
作为一个检查,我想使用isFinishing()(我不能使用isDestroyed(),因为我的最低API级别是16而不是17,isDestroyed()需要).
我可以在回调中使用isFinishing()来确保我的逻辑仅在Activity未被销毁时执行吗?
更具体地说,即使在调用onDestroy()之后,isFinishing()对于通过调用finish()销毁的Activity返回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是包私有的,所以理论上另一个类可以修改这个值.在实践中,我认为可以安全地假设isFinishing()返回true,如果一个Activity正在完成或已经完成!
换句话说,isFinishing()== isFinishing()|| isDestroyed()