Android 检查生命周期状态

Android 检查生命周期状态,android,android-fragments,android-lifecycle,Android,Android Fragments,Android Lifecycle,我正在尝试使用一个实例保留片段,它应该在onResume()和onPause()期间处理一些事情。我已经把它添加到主要活动中,到目前为止,它工作得很好,除了一件事。如果我在应用程序中输入另一个活动,比如说应用程序设置,这个片段仍然会在屏幕翻转时执行onResume和onPause 我需要的是一种方法来确定这个片段所连接的活动是否不在前景中。我尝试过类似isTaskRoot的方法,但只要执行这些生命周期方法,它就会返回true。现在,如果Android知道在运行onResume后将此片段放入暂停状

我正在尝试使用一个实例保留片段,它应该在
onResume()
onPause()期间处理一些事情。我已经把它添加到主要活动中,到目前为止,它工作得很好,除了一件事。如果我在应用程序中输入另一个活动,比如说应用程序设置,这个片段仍然会在屏幕翻转时执行onResume和onPause


我需要的是一种方法来确定这个片段所连接的活动是否不在前景中。我尝试过类似isTaskRoot的方法,但只要执行这些生命周期方法,它就会返回true。现在,如果Android知道在运行onResume后将此片段放入暂停状态,那么必须有一种方法从onResume方法中检查此情况?

活动在调用其
onPause()
时变为非前台。 当调用活动的
onResume()
时,该活动成为前台

找到答案的一种方法

此片段所附加到的活动是否不在 前景

是让活动在活动的
onPause()
方法中设置
isForeground=false
,并在活动的
onResume()
方法中设置
isForeground=true
,并通过类似的回调接口使此标志可用于片段。唯一的区别是将片段事件推送到活动,片段将读取活动状态(例如,
SomeInterface.get前台()


另一种方法是定义一个公共方法
MyFragment.setForeground(布尔前景)
,并让活动从其
onPause()
onResume()
方法调用此方法。

只需使用活动的函数
hasWindowFocus()
。这对我有用。您可以使用它设置一个标志,以在活动确实返回焦点时完成操作,并在
onResume()

中检查标志,我需要的是从onResume的片段中知道它是否真的在继续。正如我所说,如果我将活动更改为设置活动,那么onResume将在属于主活动的片段中调用,即使这不是我当前所在的活动。在这些情况下,我不应该在resume或pause中执行任何操作,因为片段并没有真正恢复。我不知道为什么在活动处于后台时会调用这些函数,但是在任何情况下,我都需要一种从片段本身的回调中辨别的方法。onPause()调用MyFragment.setForeground(false),这将把MyFragment.isParentInForeground设置为false。然后MyFragment.onResume()可以检查isParentInForeground是真是假并做出决定。顺便说一句,当片段位于后台时调用MyFragment.onPause/onResume确实很奇怪:(我不能使用该活动。这是一个小型库,可以将片段注入到我可能需要的任何活动中。我认为调用回调是由于Retain实例状态。我发现更奇怪的是,如果我在后台执行一个类并在onResume()中解析片段“This”,然后是fragment.getActivity()在被调用的类中为null,但如果我从onResume()中调用getActivity()方法,则不是。如果是,则我可以使用它来检查当前状态。保留实例状态未经过仔细考虑。例如,加载程序无法处理这些片段。不过,我仍然认为您可以使用方法#1。查看此示例。声明公共接口MyActivity{boolean isForeground())}。使所有活动实现此接口。将活动强制转换为onAttach()中的MyActivity。在MyFragment中,从onPause()和onResume()调用isForeground().你说的对,接口可能是目前的解决方案,谢谢,这并不是问题的确切答案,但当我不想在非当前活动中执行某些操作,并且我无法跟踪主机应用程序中的状态(因为我不拥有该应用程序)时,这对我来说是有效的。
public class MyFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public void onResume() {
        super.onResume();

        if (?) {
            ... handle ...
        }
    }

    @Override
    public void onPause() {
        super.onPause();

        if (?) {
            ... handle ...
        }
    }
}