2015-02-11 69 views
1

我知道應該使用FragmentTransaction創建Fragment,並在片段第一次使用時將其添加到管理器中。但稍後可以在配置更改(如屏幕旋轉)後通過findFragmentByIdfindFragmentbyTag找到。Android中使用FragmentManager進行碎片回收的目的是什麼?

但在屏幕旋轉,我發現,構造和所有的回調片段onAttachonCreateonCreateViewonStartonResume被再次調用的方法,即使從findFragmentByTag返回的片段沒有明確地調用構造函數。

,該構造函數被調用的事實意味着,該片段對象可以是垃圾收集。那麼片段的哪部分實際上存儲在配置更改上?如果片段對象被垃圾回收並重新創建,那麼回收它的目的是什麼?

回答

1

該片段未被回收。如果在屏幕方向後登錄Fragment.toString(),則會得到不同的值,這意味着這些片段實例是不同的,從頭開始創建。所有生命週期方法都稱爲但是您可以通過onSaveInstanceState(Bundle)保留一些值。

這不是碎片,你叫setRetainInstance(true)如此。現在唯一重複的生命週期方法是onCreateView,onViewCreated(長暫停),onDestroyView。實例是一樣的,字段變量被保留。

編輯:

不會Android操作系統自動銷燬,並創建片段和設置的onCreate之前相同的標籤和ID叫上託管的活動?

TL; DR:是的。

FragmentState類字段變量包含有關一個片段的信息,其中總是保留(除其他標記和ID之外)。

當你旋轉屏幕FragmentManagerImpl.restoreAllState(...)被稱爲其或者待價而沽保留片段或實例化新的碎片,並將它們重新附加到新的活動。這發生在Activity.onCreate(Bundle)的一部分。

那麼什麼片段的一部分實際上是存儲在配置更改?

如上所述的FragmentState加上您或框架在onSaveInstanceState(Bundle)中寫入的任何內容。如果片段被標記爲保留,則保存除視圖層次結構以外的所有內容。

如果片段對象被垃圾回收並重新創建,那麼回收它的目的是什麼?

如果它是從頭開始銷燬並創建的(新實例),則根本無法回收。您要麼保留片段實例 - 同一個實例存在屏幕方向更改 - 或保存並恢復實例狀態 - 舊片段實例被銷燬,新片段實例被創建並填充來自舊實例的一些數據。

+0

然後,如何通過調用託管Activity的'onCreate'中的'findFragmentByTag'來獲取片段的引用?在操作之後在託管Activity上調用onCreate之前,Android OS是否會自動銷燬並創建片段並設置相同的標籤和ID? – jenddy 2015-02-11 07:52:38

+0

@jenddy嗨,請檢查最新的答案。簡而言之:是的,活動能夠記住標籤和ID。 – 2015-02-11 08:14:56