2017-08-02 40 views
1

我只在应用程序启动时试图调用自定义对话框。生命周期状态总是初始化

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

但是当前状态总是初始化的。 Im通过GameActivity实现接口LifecycleRegistryOwner

对不起,如果我没有很好地理解这个新的api。 谢谢

+0

得到了appCompat片段的同样的问题。巴勃罗,你知道这个解决方案吗? –

+0

没有抱歉,我还没有使用过这个api更多 –

回答

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完成。因此,在某些逻辑中烘烤以确定是否适合做需要做的事情是合适的。

为使此代码正常工作,要观察生命周期事件的类必须实现LifecycleObserver。这可以是任何类,甚至活动或片段本身。下面的代码适用于将作为生命周期观察者的普通类/模块。

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

如果你是做一个活动遵守它自己的生命周期,将是这样的:

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

对于它的工作原理相同的片段,但可以观察它自己的生命周期或者说明活动。如果你想要观察活动的生命周期,你可以这样做。否则,它将和上面的Activity示例一样。

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

最后一点,我不完全清楚如果一个Activity或Fragment观察它自己的生命周期是最佳实践。但它确实有效,而且似乎没有这样做的不良后果。我目前正在使用上述方法在我正在处理的几个应用程序中。

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

+0

此代码无效。也没有Lifecycle.Event“开始”。 –

+0

@SlavaSotone你是对的。不知道为什么当我写这篇文章的时候,我为什么会陷入困境。此外,我添加了一些更详细的代码,以显示如何让代码工作。 – Azethoth

+0

从appCompat 26.1开始,您不需要创建观察者。要获取android.support.v4.app.Fragment或AppCompatActivity的生命周期状态,只需使用:lifecycle.currentState.isAtLeast(Lifecycle.STATE.STARTED) –

0

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

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

所以,如果你使用com.android.support:appcompat-v7:26.1.0,android.support.v4.app。片段或AppCompatActivity使用以下内容:

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

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

相关问题