1

我已經開始學習架構組件,但找不到一件事。LifecycleRegistry實例何時開始監聽LifecycleOwner的生命週期更改?

LifecycleFragment只是創建一個新的LifecycleRegistry對象,該對象並未開始觀察片段的生命週期。

我猜LifecycleRegistry對象開始監聽片段的生命週期,例如,當我們將它作爲第一參數放入LiveData.observe()時,但我還沒有在源代碼中找到任何證明。

問題:LifecycleRegistry對象何時以及如何開始觀察片段的生命週期並刷新LifecycleRegistry.mState

回答

2

有一個ContentProvider被稱爲LifecycleRuntimeTrojanProvider,它合併到應用程序的AndroidManifest.xml。在其onCreate方法中,它初始化一個名爲LifecycleDispatcher的單例,它負責更新所有LifecycleRegistry實例。

LifecycleDispatcher使用Application.registerActivityLifecycleCallbacks方法,自API 14開始,在創建新活動時收到通知。此時它將ReportFragment的實例注入到活動中。該ReportFragment使用Fragment生命週期回調來更新活動的LifecycleRegistry如果必要的話,像這樣:

@Override 
public void onStop() { // Showing onStop as example 
    super.onStop(); 
    dispatch(Lifecycle.Event.ON_STOP); 
} 

private void dispatch(Lifecycle.Event event) { 
    if (getActivity() instanceof LifecycleRegistryOwner) { 
     ((LifecycleRegistryOwner) getActivity()).getLifecycle().handleLifecycleEvent(event); 
    } 
} 

如果新的活動是FragmentActivity,該LifecycleDispatcher電話FragmentManager.registerFragmentLifecycleCallbacks得到通知的活動的片段生命週期事件。它將onFragmentCreated,onFragmentStartedonFragmentResumed回調中繼至LifecycleRegistry,以防止片段爲LifecycleRegistryOwner,與以前一樣。

onFragmentPausedonFragmentStopped,和onFragmentDestroyed回調被稱爲對應的回調被稱爲在片段之後,但在LifecycleObserver回調之前必須調用。所以無論何時創建一個片段,LifecycleDispatcher都會向其中注入一個LifecycleDispatcher.DestructionReportFragment的實例。 DestructionReportFragment的生命週期回調用於更新註冊表以暫停,停止和銷燬事件。

我無法鏈接到代碼,因爲它尚未發佈,但是您可以在將庫添加到項目後在Android Studio中瀏覽它。

-1

LifecycleFragment和LifecycleActivity目前尚未完全實施。這些類將在lib達到1.0版本時執行。目前,您可以使用這些LifecycleRegistry觀察LiveData對象。這些對象基於將來的結果,例如,成爲數據庫中的一個對象。

的官方文檔可以在這裏找到:https://developer.android.com/topic/libraries/architecture/index.html

關於你提到的兩類官方聲明:

生命週期片段和ActivityCompat在支持庫不 尚未實現LifecycleOwner接口。當架構 組件達到1.0.0版本時,他們將會。

3

正如Mordag所說,截至目前,LifecycleActivity和LifecycleFragment都尚未實施。在他們的文檔谷歌表示:

任何定製的片斷或活動可以通過執行內置LifecycleRegistryOwner接口(而不是延長LifecycleFragment或LifecycleActivity)變成一個LifecycleOwner。

然而,這只是故事的一半,因爲自然使用的是這些生命週期數據的組件,以便能夠對您的活動/片段生命週期,並與他們的代碼段,它只是不工作的反應,因爲一個初始化像這樣的活動/片段的生命週期註冊

LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); 

只會讓您處於初始化狀態的生命週期。

因此,長話短說,爲了使它現在能夠正常工作(在1.0版本發佈之前),您需要實現實現LifecycleRegistry的Activity/Fragment的生命週期。因此,對於活動/片段的每次回調,你需要這樣做:

public class ScoreMasterFragment extends Fragment implements LifecycleRegistryOwner { 


private LifecycleRegistry lifecycle; 

@Override 
public LifecycleRegistry getLifecycle() { 
    return lifecycle; 
} 

public ScoreMasterFragment(){ 
    lifecycle new LifecycleRegistry(this); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //more code here 
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    //more code here 
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START); 

} 

@Override 
public void onResume() { 
    super.onResume(); 
    //more code here 
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    //more code here 
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    //more code here 
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    //more code here 
    _lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); 
} 

這可能會在未來LifecycleActivity和LifecycleFragment的代碼,但在那之前,如果你把你的活動/碎片觀測一些LifecycleAware對象(如LiveData),你將不得不這樣做。

在LiveData的情況下,因爲它不會通知它的觀察者,除非它們至少處於STARTED狀態,並且在其他情況下是因爲如果其唯一狀態是INITIALIZED,其他LifecycleAware組件就不能對生命週期做出反應。

+0

謝謝你的回答,但不,我不需要做所有這些回調,它的工作現在。你只需要定義LifecycleRegistry並實現LifecycleOwner –

+0

那麼我可能會誤解你的問題。但是我寫的基本上是定義了一個LifecycleRegistry,我相信你在觀察LiveData時需要這樣做。難道你不是在找? – CarlosGoncalves

+0

卡洛斯,即時通訊尋找活動或片段如何將有關變更生命週期的信息發送到生命週期註冊對象 –

-1

LifecycleActivity,LifecycleFragment和LifecycleRegistryOwner接口在API級別1.0.0中已被棄用。使用android.support.v7.app.AppCompatActivity和android.support.v4.app.Fragment代替它。 這裏的官方文檔LifecycleActivityLifeCycleFragment

相關問題