天天看點

fragement生命周期

你的fragment們可以向activity的菜單(按Manu鍵時出現的東西)添加項,同時也可向動作欄(界面中頂部的那個區域)添加條目,這都需通過實作方法onCreateOptionManu()來完成。

你從fragment添加到菜單的任何條目,都會出現在現有菜單項之後。Fragment之後可以通過方法onOptionsItemSelected()來響應自己的菜單項被選擇的事件。

你也可以在fragemnt中注冊一個view來提供快捷菜單(上下文菜單)。當使用者要打開快捷菜單時,fragment的onCreateContextMenu()方法會被調用。當使用者選擇其中一項時,fragemnt的onContextItemSelected()方法會被調用。

注:盡管你的fragment可以分别收到它所添加的菜單項的選中事件,但是activity才是第一個接收這些事件的家夥,隻有當activity對某個事件置之不理時,fragment才能接收到這個事件,對于菜單和快捷菜單都是這樣。

管理fragment的生命周期有些像管理activity的生命周期。Fragment可以生存在三種狀态:

Resumed:

Fragment在一個運作中的activity中并且可見。

Paused:

另一個activity處于最頂層,但是fragment所在的activity并沒有被完全覆寫(頂層的activity是半透明的或不占據整個螢幕)。

Stoped:

Fragment不可見。可能是它所在的activity處于stoped狀态或是fragment被删除并添加到後退棧中了。此狀态的fragment仍然存在于記憶體中。

同樣類似于activity,你可以把fragment的狀态儲存在一個Bundle中,在activity被recreated時就需用到這個東西。你可以在onSaveInstanceState()方法中儲存狀态并在onCreate()或onCreateView()或onActivityCreated()中恢複,關于更多的儲存狀态的資訊,請參考Activitys章節。

Fragment與Activity的生命周期中最大的不同就是存儲到後退棧中的過程。Activity是在停止時自動被系統壓入停止棧,并且這個棧是被系統管理的;而fragment是被壓入activity所管理的一個後退棧,并且隻有你在删除fragment後并明确調用addToBackStack()方法時才被壓入。

然而,管理fragment的生命周期與管理activity的生命周期極其相似。你所需要去思考的是activity的生命周期如何影響fragment的生命周期。

fragement生命周期

協調與activity生命周期的關系

Activity直接影響它所包含的fragment的生命周期,是以對activity的某個生命周期方法的調用也會産生對fragment相同方法的調用。例如:當activity的onPause()方法被調用時,它所包含的所有的fragment們的onPause()方法都會被調用。

Fragment比activity還要多出幾個生命周期回調方法,這些額外的方法是為了與activity的互動而設立,如下:

onAttach()

當fragment被加入到activity時調用(在這個方法中可以獲得所在的activity)。

onCreateView()

當activity要得到fragment的layout時,調用此方法,fragment在其中建立自己的layout(界面)。

onActivityCreated()

當activity的onCreated()方法傳回後調用此方法。

onDestroyView()

當fragment的layout被銷毀時被調用。

onDetach()

當fragment被從activity中删掉時被調用。

一旦activity進入resumed狀态(也就是running狀态),你就可以自由地添加和删除fragment了。是以,隻有當activity在resumed狀态時,fragment的生命周期才能獨立的運轉,其它時候是依賴于activity的生命周期變化的。