Fragment

What

在Activity中提供畫面的組件,不同於其他組件的是其有自己的生命週期,可以當成一種子Activtiy
由於是由Activity去產生Fragment,所以其生命週期是緊緊相扣的

新增

在layout.xml裡面新增,或是透過FragmentTransaction新增,並呼叫commit
使用beginTransaction-> fragmentTransaction.add -> commit套用

替換

所有曾被加入的fragment將會被銷毀然後再加入新的
使用beginTransaction -> replace new的Fragment -> pushToBackStack 記錄替換動作(以防使用者點選返回要回復上一狀態) -> commit套用

取得

用FragmentManager

和activity溝通

getActivty

和Fragment溝通

Broadcast或是透過activity的interface

沒call onDestroy

Fragment的onDestroy是由Activity啟用,但activity的onDestroy並沒有保證一定會被call或是執行完畢,因為activity的onDestroy和onStop是可以被中斷的,也就代表Fragment的onDestroy就不一定會被執行

Summary

一個有提供畫面的組件,有自己的lifecycle。新增或刪除都需要使用beginTransaction來取得transaction,要注意的事replace會讓整個以經被加入的fragment銷毀。可用getActivity與activity溝通,或是用local service或是handler。由於Fragment的onDestroy跟activity綁在一起,而activity的onDestroy沒有保證一定會跑完,代表Fragment的onDestroy不一定會被呼叫。

生命週期

SampleFragmentActivity: onCreate
SampleFragmentActivity: onContentChanged
SampleFragment: onAttach
SampleFragmentActivity: onAttachFragment
SampleFragment: onCreate
SampleFragment: onCreateView
SampleFragment: onActivityCreated (onCreate return)
SampleFragment: onViewStateRestored
SampleFragmentActivity: onStart
SampleFragment: onStart
SampleFragmentActivity: onPostCreate
SampleFragmentActivity: onResume
SampleFragment: onResume
SampleFragmentActivity: onPostResume
SampleFragmentActivity: onAttachedToWindow
SampleFragmentActivity: onCreateOptionsMenu
SampleFragmentActivity: onPrepareOptionsMenu

SampleFragment: onPause
SampleFragmentActivity: onPause
SampleFragment: onStop
SampleFragmentActivity: onStop
SampleFragment: onDestroyView
SampleFragment: onDestroy
SampleFragment: onDetach
SampleFragmentActivity: onDestroy
SampleFragmentActivity: onDetachedFromWindow

Ref

http://stackoverflow.com/questions/17195641/fragment-lifecycle-when-ondestroy-and-ondestroyview-are-not-called