1. 程式人生 > >原始碼分析---onSaveInstanceState()方法分析

原始碼分析---onSaveInstanceState()方法分析

①在Activity的onSaveInstanceState()方法中,呼叫super()方法,裡面最終就是呼叫這裡的方法。主要是儲存activity的狀態,fragment的狀態,最終呼叫application進行儲存狀態。 在這裡插入圖片描述 ②首先是Activity的狀態。上面的mWindow其實就是PhoneWindow,然後呼叫saveHierarchyState()方法。這裡會使用mContentParent.saveHierarchyState(states)方法,mContentParent就是在onCreate()中產生的contentView.它本身就是ViewGroup,但是在ViewGroup類中並沒有saveHierarchyState()方法,這個方法在它的父類View中。 在這裡插入圖片描述

③在View類這個方法主要是儲存view類的狀態。 在這裡插入圖片描述 但是需要注意的是,view必須設定id,否則就能不能把狀態儲存在SparseArray中 在這裡插入圖片描述 在這裡正常情況下mStartActivityRequestWho肯定是為空值。因此預設返回的就空的狀態物件:BaseSavedState.EMPTY_STATE,也就是沒有儲存任何的View的狀態。 在這裡插入圖片描述 ④儲存fragment的狀態,mHost是FragmentHostCallback的物件。mFragmentManager是FragmentManagerImpl的物件。 在這裡插入圖片描述 其中saveAllState()方法程式碼比較多,主要就是fragment的各個狀態的記錄。 這裡的mActive就是fragment的map集合。他是在onCreateView()中呼叫addFragment()方法後新增進去的。 在這裡插入圖片描述

在這裡插入圖片描述 最終返回的就是儲存fragment狀態的物件。其中的各個屬性都是從上面程式碼中儲存的狀態。 在這裡插入圖片描述 ⑤ 在Application類中進行最後的狀態的儲存。 在這裡插入圖片描述

收集activity的回撥 在這裡插入圖片描述

其實在TextView中,其實也有onSaveInstanceState()方法和onRestoreInstanceState()方法,能夠儲存文字和文字的開始結束的位置等。