生命週期回顧
Activity和Fragment的生命週期是Android開發的基礎,也是其中最重要的一部分,掌握了各種情景下的生命週期,能夠更好的幫助我們解決問題
Activity的生命週期方法以及常用方法
onCreate():
當activity是被建立時候,會自動執行該方法。該方法做一些初始化動作.
onRestart():
把activity從onStop狀態喚醒時,會用onRestart方法,該方法優先於再次執行的onStart,執行完onRestart之後執行onStart。
onStart():
當activity對使用者可見時會呼叫onStart,當activity在前臺顯示時,會執行onResume
onResume():
當activity開始與使用者互動時,會呼叫onResume,並且為了使用者操作此時該activity位於activity棧的頂部。
onPause():
當一個activity執行到onResume方法後,不管是這個activity要銷燬還是要暫停或停止,都會呼叫該方法。
onStop():
當這個activity完全看不見的時候,會呼叫onStop方法,因為另一個activity會呼叫onResume並且覆蓋這個activity。
onDestroy():
當activity銷燬前會呼叫該方法,比如發生如下情況:activity呼叫了finish()方法來結束這個activity,或者因為系統為了節省空間而臨時銷燬這個activity,這兩個情況可以通過isFinishing()方法判斷
onSaveInstanceState():
當使用者按下Home鍵或者程式異常退出以及螢幕旋轉時會呼叫此方法進行儲存資料
onRestoreInstanceState():
螢幕旋轉或異常退出後重新開啟會呼叫此方法,進行恢復資料
onConfigurationChanged():
AndroidManifest設定configChanges屬性後,會呼叫此方法
onNewInstent():
非預設模式時,啟動一個已存在的Activity時候,會先呼叫這個方法。需要在此方法中更新intent
onActivityResult():
A介面呼叫startActivityForResult()方法跳轉B介面,B介面返回時會呼叫此方法,進行對B介面返回的資料進行處理
Activity啟動模式
standard(預設)
預設的模式,每次新建Activity時候都會在棧中加入一個Activity。
具體生命週期呼叫是onCreate()->onStart()->onResume()
singleTop
如果一個Activity已經存在,並且處於任務棧的棧頂。那麼再啟動這個Activity時不會建立新的例項,而是直接呼叫當前Activity的onNewIntent()方法,啟動。使用場景多在商品詳情頁
具體的生命週期是onNewIntent()->onResume()。
singleTask
棧內唯一的啟動方式。如果任務棧中已經存在當前Activity,那麼直接啟動當前Activity,不建立新的例項。同時在當前Activity棧之上的Activity會被移除。可以用來設定主頁面。
具體生命週期呼叫是onNewIntent()->onRestart()->onStart()->onResume()。
singleInstance
在一個新的棧中開啟一個Activity。可以用來共享Activity。如在一個應用中建立了一個Activity,然後在另一個應用中頁可以再以這個模式建立這個Activity時,不會重複建立。
具體生命週期呼叫是onNewIntent()->onRestart()->onStart()->onResume()。
普通Activity的生命週期
Activity的建立
onCreate() -> onStart() -> onResume()
點選返回鍵
onPause() -> onStop() -> onDestroy()
按Home鍵時Activity的生命週期
Activity的建立
onCreate() -> onStart() -> onResume()
點選Home鍵或鎖屏
onPause() -> onSaveInstanceState() -> onStop()
切換回來或解鎖
onRestart() -> onStart() -> onResume()
Activity橫豎屏旋轉生命週期
1. AndroidManifest沒有設定configChanges屬性:
onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
2.android:configChanges="orientation"
Android 6.0 : onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
Android 7.0 : onConfigurationChanged() -> onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
Android 8.0 9.0 : onConfigurationChanged()
設定android:configChanges="orientation|keyboardHidden|screenSize" 只會呼叫只呼叫了onConfigurationChanged()方法,Activity的其他生命週期方法都不會呼叫
3.android:configChanges="orientation|keyboardHidden|screenSize"
Android 6.0 7.0 8.0 9.0 : 只呼叫了onConfigurationChanged() 方法
4.android:configChanges="orientation|screenSize"
情景4和情景3的結果是一樣的
5.android:configChanges="orientation|keyboardHidden"
情景5和情景2是一樣的
結論
- 不設定configChanges屬性不會回撥onConfigurationChanged,且切屏的時候會回撥生命週期方法
- 只有設定了orientation 和 screenSize 才不會走生命週期方法,只回撥onConfigurationChanged方法
- 設定orientation,沒有設定screenSize,切屏會回撥onConfigurationChanged,8.0 和 9不會呼叫生命週期方法,8.0以下的還是會呼叫生命週期方法
configChanges屬性
1. orientation 螢幕在縱向和橫向間旋轉
2.keyboardHidden 鍵盤顯示或隱藏
3.screenSize 螢幕大小改變了
4.fontScale 使用者變更了首選的字型大小
5.locale 使用者選擇了不同的語言設定
6.keyboard 鍵盤型別變更,例如手機從12鍵盤切換到全鍵盤
7.touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件
screenOrientation屬性
1. unspecified 預設值,由系統判斷狀態自動切換
2. landscape 橫屏
3. portrait 豎屏
4. user 使用者當前設定的orientation值
5. behind 下一個要顯示的Activity的orientation值
6. sensor 使用感測器 感測器的方向
7. nosensor 不使用感測器 基本等同於unspecified
複製程式碼
Activity異常結束生命週期
異常情況導致Activity被殺死並重建
onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
兩個普通Activity間跳轉時的生命週期
開啟程式: MainActivity: onCreate() -> onStart() -> onResume()
跳轉到SecondActivity
- MainActivity: onPause()
- SecondActivity: onCreate() -> onStart() -> onResume()
- MainActivity: onSaveInstanceState() -> onStop()
點選back鍵返回MainActivity:
- SecondActivity: onPause()
- MainActivity: onRestart() -> onStart() -> onResume()
- SecondActivity: onStop() -> onDestroy()
Activity跳轉到透明背景Activity的生命週期
開啟程式: MainActivity: onCreate() -> onStart() -> onResume()
跳轉到SecondActivity(透明背景)
- SecondActivity: onPause()
- MainActivity: onRestart() -> onStart() -> onResume()
點選back鍵返回MainActivity:
- SecondActivity: onPause()
- MainActivity: onResume()
- SecondActivity: onStop() -> onDestroy()
Activity彈出和結束小視窗時的生命週期
開啟程式: MainActivity: onCreate() -> onStart() -> onResume()
開啟對話方塊
- SecondActivity: onPause()
- MainActivity: onRestart() -> onStart() -> onResume()
結束對話方塊
- SecondActivity: onPause()
- MainActivity: onResume()
- SecondActivity: onStop() -> onDestroy()
Fragment的生命週期方法
Fragment生命週期圖
Fragment與Activity生命週期的關係圖
Fragment生命週期方法
1. onHiddenChanged():
當 Fragment 呼叫 hide() 、 show() 時回撥
2. setUserVisibleHint():
當 Fragment 與 ViewPager 結合使用時,切換 Pager 時回撥
3. onAttach():
Fragment 關聯到 Activity 時回撥,此時 Activity 已經與 Fragment 關聯,通過 Context 向下轉型,就可以與 Activity 通訊,當然也可以使用 getActivity(),前提是這個 fragment 已經和宿主的 activity 關聯,並且沒有脫離,此方法只能呼叫一次
4. onCreate():
系統建立 Fragment 的時候回撥,介於 onAttach() 和 onCreateView() 之間,一般用於初始化一些資料,值得注意的是,此時 Activity 還在建立中,因此不能在執行一些跟 Activity UI 相關的操作,否則,會出現一些難以預料的問題,比如:NullPointException,如果要對 Activity 上的 UI 進行操作,建議在 onActivityCreated() 中操作
5. onCreateView():
建立 Fragment 需要顯示的 View,預設返回 null。當返回的 View 不為 null 時,View 被銷燬時會呼叫 onDestroyView(),此處應該只進行佈局的初始化,而不應該執行耗時操作,如網路請求、資料庫讀取
6. onViewCreated():
該方法在 onCreateView() 之後會被立即執行,此時可以對 View 物件進行賦值,當然在 onCreateView() 中也可以執行
7. onActivityCreated():
當 Activity 執行完 onCreate() 方法後呼叫,此時可以執行與 Activity 相關的 UI 操作
8. onStart():
同Activity生命週期
9. onResume():
同Activity生命週期
10. onPause():
同Activity生命週期
11. onStop():
同Activity生命週期
12. onDestroyView():
表示銷燬 Fragment 相關聯的 UI 佈局,清除所有跟檢視相關的資源。
13. onDestroy():
銷燬 Fragment 物件的時候呼叫,一般是呼叫 Activity 的 onDestroy() 的時候執行
14. onDetach():
解除 Fragment 與 Activity 的關聯時呼叫,在Activity 的 onDestroy()時候執行
replace()時的生命週期
程式執行並顯示第一個Fragment:
E/AddReplaceActivity: onCreate()
E/Fragment1: onAttach()
E/Fragment1: onCreate()
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment1: onStart()
E/AddReplaceActivity: onStart()
E/AddReplaceActivity: onResume()
E/Fragment1: onResume()
複製程式碼
顯示第二個Fragment:
E/Fragment2: onAttach()
E/Fragment2: onCreate()
E/Fragment1: onPause()
E/Fragment1: onStop()
E/Fragment1: onDestroyView()
E/Fragment1: onDestroy()
E/Fragment1: onDetach()
E/Fragment2: onCreateView()
E/Fragment2: onViewCreated()
E/Fragment2: onActivityCreated()
E/Fragment2: onStart()
E/Fragment2: onResume()
複製程式碼
點選返回鍵結束Activity
E/Fragment2: onPause()
E/AddReplaceActivity: onPause()
E/Fragment2: onStop()
E/AddReplaceActivity: onStop()
E/Fragment2: onDestroyView()
E/Fragment2: onDestroy()
E/Fragment2: onDetach()
E/AddReplaceActivity: onDestroy()
複製程式碼
add(), hide()和show()時的生命週期
情景1: 啟動程式,把5個Fragment全部新增到FragmentTransaction中,並進行切換
啟動程式,把5個Fragment全部新增到FragmentTransaction中,並顯示第一個Fragment:
E/AddReplaceActivity: onCreate()
E/Fragment1: onAttach()
E/Fragment1: onCreate()
E/Fragment2: onAttach()
E/Fragment2: onCreate()
E/Fragment3: onAttach()
E/Fragment3: onCreate()
E/Fragment4: onAttach()
E/Fragment4: onCreate()
E/Fragment5: onAttach()
E/Fragment5: onCreate()
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment2: onCreateView()
E/Fragment2: onViewCreated()
E/Fragment2: onActivityCreated()
E/Fragment3: onCreateView()
E/Fragment3: onViewCreated()
E/Fragment3: onActivityCreated()
E/Fragment4: onCreateView()
E/Fragment4: onViewCreated()
E/Fragment4: onActivityCreated()
E/Fragment5: onCreateView()
E/Fragment5: onViewCreated()
E/Fragment5: onActivityCreated()
E/Fragment1: onHiddenChanged() => true
E/Fragment2: onHiddenChanged() => true
E/Fragment3: onHiddenChanged() => true
E/Fragment4: onHiddenChanged() => true
E/Fragment5: onHiddenChanged() => true
E/Fragment1: onHiddenChanged() => false
E/Fragment1: onStart()
E/Fragment2: onStart()
E/Fragment3: onStart()
E/Fragment4: onStart()
E/Fragment5: onStart()
E/AddReplaceActivity: onStart()
E/AddReplaceActivity: onResume()
E/Fragment1: onResume()
E/Fragment2: onResume()
E/Fragment3: onResume()
E/Fragment4: onResume()
E/Fragment5: onResume()
複製程式碼
切換Fragment:
E/Fragment1: onHiddenChanged() => true
E/Fragment2: onHiddenChanged() => false
複製程式碼
結束Activity:
E/Fragment1: onPause()
E/Fragment2: onPause()
E/Fragment3: onPause()
E/Fragment4: onPause()
E/Fragment5: onPause()
E/AddReplaceActivity: onPause()
E/Fragment1: onStop()
E/Fragment2: onStop()
E/Fragment3: onStop()
E/Fragment4: onStop()
E/Fragment5: onStop()
E/AddReplaceActivity: onStop()
E/Fragment1: onDestroyView()
E/Fragment1: onDestroy()
E/Fragment1: onDetach()
E/Fragment2: onDestroyView()
E/Fragment2: onDestroy()
E/Fragment2: onDetach()
E/Fragment3: onDestroyView()
E/Fragment3: onDestroy()
E/Fragment3: onDetach()
E/Fragment4: onDestroyView()
E/Fragment4: onDestroy()
E/Fragment4: onDetach()
E/Fragment5: onDestroyView()
E/Fragment5: onDestroy()
E/Fragment5: onDetach()
E/AddReplaceActivity: onDestroy()
複製程式碼
情景2: 動態往FragmentTransaction裡面新增Fragment並進行切換
程式啟動,並顯示第一個Fragment:
E/AddReplaceActivity: onCreate()
E/Fragment1: onAttach()
E/Fragment1: onCreate()
E/Fragment1: onHiddenChanged() => true
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment1: onHiddenChanged() => false
E/Fragment1: onStart()
E/AddReplaceActivity: onStart()
E/AddReplaceActivity: onResume()
E/Fragment1: onResume()
複製程式碼
切換到未建立例項的Fragment:
E/Fragment1: onHiddenChanged() => true
E/Fragment2: onAttach()
E/Fragment2: onCreate()
E/Fragment2: onHiddenChanged() => true
E/Fragment2: onCreateView()
E/Fragment2: onViewCreated()
E/Fragment2: onActivityCreated()
E/Fragment2: onStart()
E/Fragment2: onResume()
E/Fragment2: onHiddenChanged() => false
複製程式碼
切換到已建立例項的Fragment:
E/Fragment1: onHiddenChanged() => true
E/Fragment2: onHiddenChanged() => false
複製程式碼
結束Activity:
E/Fragment1: onPause()
E/Fragment2: onPause()
E/Fragment3: onPause()
E/AddReplaceActivity: onPause()
E/Fragment1: onStop()
E/Fragment2: onStop()
E/Fragment3: onStop()
E/AddReplaceActivity: onStop()
E/Fragment1: onDestroyView()
E/Fragment1: onDestroy()
E/Fragment1: onDetach()
E/Fragment2: onDestroyView()
E/Fragment2: onDestroy()
E/Fragment2: onDetach()
E/Fragment3: onDestroyView()
E/Fragment3: onDestroy()
E/Fragment3: onDetach()
E/AddReplaceActivity: onDestroy()
複製程式碼
備註: add(), hide()和show()方式的懶載入方案可以針對onHiddenChanged()方法去實現
ViewPager+Fragment時Fragment切換時的生命週期
場景1: 沒有設定 viewPager.offscreenPageLimit = 5
程式啟動,並顯示第一個Fragment
E/ViewPagerActivity: onCreate()
E/ViewPagerActivity: onStart()
E/ViewPagerActivity: onResume()
E/Fragment1: setUserVisibleHint() => false
E/Fragment2: setUserVisibleHint() => false
E/Fragment1: setUserVisibleHint() => true
E/Fragment1: onAttach()
E/Fragment1: onCreate()
E/Fragment2: onAttach()
E/Fragment2: onCreate()
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment1: onStart()
E/Fragment1: onResume()
E/Fragment2: onCreateView()
E/Fragment2: onViewCreated()
E/Fragment2: onActivityCreated()
E/Fragment2: onStart()
E/Fragment2: onResume()
複製程式碼
切換第二個: 會預載入第三個頁面
E/Fragment3: setUserVisibleHint() => false
E/Fragment1: setUserVisibleHint() => false
E/Fragment2: setUserVisibleHint() => true
E/Fragment3: onAttach()
E/Fragment3: onCreate()
E/Fragment3: onCreateView()
E/Fragment3: onViewCreated()
E/Fragment3: onActivityCreated()
E/Fragment3: onStart()
E/Fragment3: onResume()
複製程式碼
切換第三個: 預載入第四個頁面,並且第一個頁面會呼叫 onPause()->onStop()->onDestroyView()
E/Fragment4: setUserVisibleHint() => false
E/Fragment2: setUserVisibleHint() => false
E/Fragment3: setUserVisibleHint() => true
E/Fragment4: onAttach()
E/Fragment4: onCreate()
E/Fragment1: onPause()
E/Fragment1: onStop()
E/Fragment1: onDestroyView()
E/Fragment4: onCreateView()
E/Fragment4: onViewCreated()
E/Fragment4: onActivityCreated()
E/Fragment4: onStart()
E/Fragment4: onResume()
複製程式碼
切換第四個: 預載入第五個頁面,並且第二個頁面會呼叫 onPause()->onStop()->onDestroyView()
E/Fragment5: setUserVisibleHint() => false
E/Fragment3: setUserVisibleHint() => false
E/Fragment4: setUserVisibleHint() => true
E/Fragment5: onAttach()
E/Fragment5: onCreate()
E/Fragment2: onPause()
E/Fragment2: onStop()
E/Fragment2: onDestroyView()
E/Fragment5: onCreateView()
E/Fragment5: onViewCreated()
E/Fragment5: onActivityCreated()
E/Fragment5: onStart()
E/Fragment5: onResume()
複製程式碼
結束Activity
E/Fragment4: onPause()
E/Fragment5: onPause()
E/Fragment3: onPause()
E/ViewPagerActivity: onPause()
E/Fragment4: onStop()
E/Fragment5: onStop()
E/Fragment3: onStop()
E/ViewPagerActivity: onStop()
E/Fragment4: onDestroyView()
E/Fragment4: onDestroy()
E/Fragment4: onDetach()
E/Fragment5: onDestroyView()
E/Fragment5: onDestroy()
E/Fragment5: onDetach()
E/Fragment3: onDestroyView()
E/Fragment3: onDestroy()
E/Fragment3: onDetach()
E/Fragment1: onDestroy()
E/Fragment1: onDetach()
E/Fragment2: onDestroy()
E/Fragment2: onDetach()
E/ViewPagerActivity: onDestroy()
複製程式碼
情景2: 設定 viewPager.offscreenPageLimit = 5
程式啟動,並顯示第一個:
E/ViewPagerActivity: onCreate()
E/ViewPagerActivity: onStart()
E/ViewPagerActivity: onResume()
E/Fragment1: setUserVisibleHint() => false
E/Fragment2: setUserVisibleHint() => false
E/Fragment3: setUserVisibleHint() => false
E/Fragment4: setUserVisibleHint() => false
E/Fragment5: setUserVisibleHint() => false
E/Fragment1: setUserVisibleHint() => true
E/Fragment1: onAttach()
E/Fragment1: onCreate()
E/Fragment2: onAttach()
E/Fragment2: onCreate()
E/Fragment3: onAttach()
E/Fragment3: onCreate()
E/Fragment4: onAttach()
E/Fragment4: onCreate()
E/Fragment5: onAttach()
E/Fragment5: onCreate()
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment1: onStart()
E/Fragment1: onResume()
E/Fragment2: onCreateView()
E/Fragment2: onViewCreated()
E/Fragment2: onActivityCreated()
E/Fragment3: onCreateView()
E/Fragment3: onViewCreated()
E/Fragment3: onActivityCreated()
E/Fragment4: onCreateView()
E/Fragment4: onViewCreated()
E/Fragment4: onActivityCreated()
E/Fragment5: onCreateView()
E/Fragment5: onViewCreated()
E/Fragment5: onActivityCreated()
E/Fragment2: onStart()
E/Fragment2: onResume()
E/Fragment3: onStart()
E/Fragment3: onResume()
E/Fragment4: onStart()
E/Fragment4: onResume()
E/Fragment5: onStart()
E/Fragment5: onResume()
複製程式碼
切換:
E/Fragment1: setUserVisibleHint() => false
E/Fragment2: setUserVisibleHint() => true
複製程式碼
結束:
E/Fragment1: onPause()
E/Fragment2: onPause()
E/Fragment3: onPause()
E/Fragment4: onPause()
E/Fragment5: onPause()
E/ViewPagerActivity: onPause()
E/Fragment1: onStop()
E/Fragment2: onStop()
E/Fragment3: onStop()
E/Fragment4: onStop()
E/Fragment5: onStop()
E/ViewPagerActivity: onStop()
E/Fragment1: onDestroyView()
E/Fragment1: onDestroy()
E/Fragment1: onDetach()
E/Fragment2: onDestroyView()
E/Fragment2: onDestroy()
E/Fragment2: onDetach()
E/Fragment3: onDestroyView()
E/Fragment3: onDestroy()
E/Fragment3: onDetach()
E/Fragment4: onDestroyView()
E/Fragment4: onDestroy()
E/Fragment4: onDetach()
E/Fragment5: onDestroyView()
E/Fragment5: onDestroy()
E/Fragment5: onDetach()
E/ViewPagerActivity: onDestroy()
複製程式碼
備註: ViewPager方式的懶載入方案可以針對setUserVisibleHint()方法去實現
Activity容器 + Navigation
程式啟動
E/NavigationActivity: onCreate()
E/Fragment1: onAttach()
E/Fragment1: onCreate()
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment1: onStart()
E/NavigationActivity: onStart()
E/NavigationActivity: onResume()
E/Fragment1: onResume()
複製程式碼
跳轉介面
E/Fragment2: onAttach()
E/Fragment2: onCreate()
E/Fragment2: onCreateView()
E/Fragment2: onViewCreated()
E/Fragment2: onActivityCreated()
E/Fragment2: onStart()
E/Fragment2: onResume()
E/Fragment1: onPause()
E/Fragment1: onStop()
E/Fragment1: onDestroyView()
複製程式碼
返回上一個介面
E/Fragment1: onCreateView()
E/Fragment1: onViewCreated()
E/Fragment1: onActivityCreated()
E/Fragment1: onStart()
E/Fragment1: onResume()
E/Fragment2: onPause()
E/Fragment2: onStop()
E/Fragment2: onDestroyView()
E/Fragment2: onDestroy()
E/Fragment2: onDetach()
複製程式碼
結束Activity
E/Fragment1: onPause()
E/NavigationActivity: onPause()
E/Fragment1: onStop()
E/NavigationActivity: onStop()
E/Fragment1: onDestroyView()
E/Fragment1: onDestroy()
E/Fragment1: onDetach()
E/NavigationActivity: onDestroy()
複製程式碼
Service生命週期方法
1. onCreate():
首次建立服務時,系統將呼叫此方法。如果服務已在執行,則不會呼叫此方法,該方法只呼叫一次。
2. onStartCommand():
當另一個元件通過呼叫startService()請求啟動服務時,系統將呼叫此方法
3. onBind():
當另一個元件通過呼叫bindService()與服務繫結時,系統將呼叫此方法。
4. onUnbind():
當另一個元件通過呼叫unbindService()與服務解綁時,系統將呼叫此方法。
5. onRebind():
當舊的元件與服務解綁後,另一個新的元件與服務繫結,onUnbind()返回true時,系統將呼叫此方法。
6. onDestroy():
當服務不再使用且將被銷燬時,系統將呼叫此方法。
啟動/繫結Service時的生命週期
1. startService()
啟動服務 startService() : onCreate() -> onStartCommand() (多次呼叫startService()方法時,onStartCommand()方法會執行多次)
停止服務 stopService(): onDestroy()
2. bindService()
繫結服務 bindService(): onCreate() —> onBind()
解綁服務 unbindService(): onUnbind() —> onDestroy()
熟練掌握這些生命週期能夠幫助我們解決很多問題