生命周期状态总是初始化

时间:2017-08-02 11:02:22

标签: android android-architecture-components

我只是在应用程序启动时尝试调用自定义对话框。

if (mGameActivity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { 
     mDialogWinByLeft.show(mGameActivity.getSupportFragmentManager(), "");
}

但目前的状态始终是初始状态。 我在LifecycleRegistryOwner上实现了接口GameActivity

很抱歉,如果我不太了解这个新api。 感谢

2 个答案:

答案 0 :(得分:1)

根据您的描述,我会猜测您正在检查onCreate中的状态。在onCreate期间,生命周期状态仅为INITIALIZED

请参阅Google的此图表。 Google Lifecycle State Diagram

那就是说你可以使用注释库来观察你进入STARTED状态的时间。

@OnLifecycleEvent(Lifecycle.EVENT.ON_START)
void doSomething(){
    //do the thing that needs the lifecycle to be at least started
}

在每个onStart完成后,这称为。因此,谨慎地采用某种逻辑来确定这是否适合做需要做的事情。

此外,为了使此代码有效,观察Lifecycle事件的类必须实现LifecycleObserver。这可以是任何类,甚至是Activity或Fragment本身。以下代码适用于将充当生命周期观察者的通用类/模块。

public class LifeCycleObserverModule implements LifecycleObserver {
    LifeCycleObserverModule(Lifecycle lifecycle) {
        //register the life cycle to observe
        this.lifecycle = lifecycle;
        this.lifecycle.addObserver(this);
    }
}

如果您要创建一个Activity,请观察它自己的生命周期,它将类似于:

public class MainActivity extends AppCompatActivity implements LifecycleObserver {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getLifecycle().addObserver(this)
    }
}

对于一个片段,它的工作方式相同,但它可以观察它自己的生命周期或活动的生命周期。如果您希望它观察Activity的生命周期,您可以这样做。否则,它将与上面的Activity示例相同。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    getActivity().getLifecycle().addObserver(this);
}

最后要注意的是,我并不完全清楚活动或片段是否遵循自己的生命周期是最佳做法。但它确实有效,并且这样做似乎没有任何不良影响。我目前正在使用上述方法处理我正在处理的几个应用程序。

编辑:更正了示例代码。它曾经说@OnLifecycleEvent(Lifecycle.EVENT.STARTED)正如评论STARTED中指出的那样不存在,正确的值是ON_START。抱歉,混合。

答案 1 :(得分:0)

如果在第一次初始化期间检查状态,例如在onStart()调用之后,生命周期状态可以是初始状态。

完全初始化Activity或Fragment后,您可以获得适当的生命周期状态。

因此,如果您使用com.android.support:appcompat-v7:26.1.0,对于android.support.v4.app.Fragment或AppCompatActivity,请使用以下命令:

lifecycle.currentState.isAtLeast(Lifecycle.STATE.STARTED)

在大多数情况下,无需创建自定义LifecycleObserver。