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之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?
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )