我只是在应用程序启动时尝试调用自定义对话框。
if (mGameActivity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
mDialogWinByLeft.show(mGameActivity.getSupportFragmentManager(), "");
}
但目前的状态始终是初始状态。
我在LifecycleRegistryOwner
上实现了接口GameActivity
。
很抱歉,如果我不太了解这个新api。 感谢
答案 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。