2017-08-02 39 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。

相關問題