获取活动的状态(暂停/恢复)。

15

我正在使用LoaderManager获取一些数据,当它完成时应该显示一个子片段。 在某些情况下,当活动已暂停并且无法执行片段事务时,会发生这种情况。

有没有一种方法可以获取活动的当前状态(似乎有一个mResume标志)?或者我必须维护自己的布尔值?


不幸的是,你必须维护自己的布尔标志,因为所有框架代码都是非公共类型。 - zgc7009
3个回答

22

新的架构组件允许您使用以下功能:

this.getLifecycle().getCurrentState()

这可以在AppCompatActivity中使用,否则Activity需要实现LifecycleOwner。请参见https://developer.android.com/topic/libraries/architecture/lifecycle。 - Björn Kechel

5

快速查看源代码中的Activity类表明,Activity类确实使用成员变量mResumed来跟踪恢复状态。但由于mResume不是公共的,isResumed()也是隐藏的,因此我们无法使用它们。

您可以通过创建一个存储状态的基本Activity类来为所有类提供该信息的简单解决方案。例如:

public class ActivityBase extends Activity {

    private boolean mIsResumed = false;

    @Override
    public void onResume() {
        super.onResume()
        mIsResumed = true;
    }

    @Override
    public void onPaused() {
        super.onPaused()
        mIsResumed = false;
    }

    public boolean isResumed() {
        return mIsResumed
    }

}

只需用您的类扩展此类:

public class MyActivity extends ActivityBase {

    private void onLoadDone() {
        if (isResumed()) {
            // Show the fragment
        }
    }

}

很遗憾,没有用于获取活动状态的内置函数。附加了一些解释和参考文献。 - Eyal Biran
如果有这样一个成员数据/方法来获取状态,则问题在于 Activity 可能无法访问或被销毁,例如在应用程序退出期间。因此,需要处理时序问题。这是 Android 框架中的一个问题。 - The Original Android
我不确定我理解你所指的问题,但由于所有活动生命周期函数都在UI线程上运行,因此不存在竞争条件/时间问题。 - Eyal Biran
如果活动确实被销毁,那么我就没有问题了,然后onLoaderFinished中的代码就不会运行。检查将在活动内部进行。isFinishing()没有帮助,因为它只是暂停。 - Gunnar Bernstein
@Eyal,我的意思是Google的语句,比如“如果活动被暂停或停止,系统可以将该活动从内存中删除...”使得难以从活动中查询状态。我认为这可能会导致竞态条件。 - The Original Android

5
一种实现方式是在你的Activity上使用断点(例如,在onResume方法中设置一个断点),然后使用评估表达式窗口,你可以通过右键单击Debug菜单窗口并从中选取它(或者对于Mac用户,使用SHIFT + F8)。打开窗口后,你可以使用以下代码在Evaluate Expression Window中拦截当前状态(取决于你设置断点的位置):
getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)

如果返回值为true,那意味着你的Activity当前处于恢复状态。如果是false,则处于另一个状态。
它还有许多其他状态可供使用,只需在此处检查即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接