一、Activity的生命週期
Activity中定義了七個回調方法,覆蓋了活動生命週期的每一個環節。
onCreate():它在活動第一次創建時被調用,在此方法中完成活動的初始化操作,如:加載佈局,綁定事件等。
onStart() :當活動由不可見變爲可見時調用。
onResume():當活動準備好與用戶進行交互時調用,此時活動一定位於返回棧的棧頂,並且處於運行狀態。
onPause:在系統去啓動或恢復另外一個活動時調用,在此方法中將一些消耗cpu的資源釋放掉,並且保存一些關鍵性數據。
onStop():當活動變爲完全不可見時調用。
onDestroy():活動銷燬之前調用,一些容易導致內存溢出的資源都要在此方法中釋放,如:移除消息和回調,解註冊Receiver,釋放MediaPlayer等。
onStart():當活動由停止狀態變爲運行狀態時調用,也就是活動被重新啓動。
注意點:
1、橫豎屏切換會重新調用Activity的各個生命週期,默認首先銷燬當前Activity然後重新加載。在功能清單文件裏添加android:configChanges="orientation|keyboardHidden|screenSize"切屏不會重新調用生命週期的各個方法,只會執行onConfigurationChanged()方法。遊戲開發或者全屏播放視頻時,朝向都是寫死的。
2、恢復或啓動另外一個activity時,如果另一個activity是窗口樣式(對話框)將只調用:onPause方法,即當前activity處於可見但不可操作狀態。
否則會調用:onPause()-->onStop(),當前activity處於不可見且不可操作的狀態。
二、Activity的四大啓動模式
1、standard:默認標準的啓動模式,每次startActivity都是創建一個新的Activity實例。適用於絕大多數情況。
2、singleTop:單一頂部,如果要開啓的activity已經處於任務棧的棧頂,就不會創建新的實例。
3、singleTask:單一任務棧,Activity在任務棧裏只會存在一個實例,如果要激活的activity在任務棧裏已經存在,
就不會再創建新的activity,而是複用這個已經存在的activity。
ps:此模式啓動activity時會清空任務棧裏在這個activity之上的所有activity。
4、singleInstance:單例模式,整個手機操作裏只有一個實例存在,不同的應用去打開這個activity,共享同一個activity實例。
ps:它會運行在自己獨立的任務棧裏,並且任務棧裏只有它一個實例存在。
三、創建一個Activity的步驟
1、繼承於Activity或FragmentActivity,CompatActivity。
2、在功能清單文件中註冊
3、完成activity對應的佈局文件
4、重寫onCreate()並加載佈局
四、在Activity的使用過程中,哪些位置用到了反射
1、在系統創建Activity對象的時候,組件都是系統自動創建的,所以組件都要在功能清單文件中註冊並標明全類名。
2、加載佈局文件時,系統通過反射創建指定標籤對應的視圖對象。
3、顯示意圖中:Intent intent = new Intent(Context context,Class clazz);intent攜帶另外一個Activity 的類型信息,系統根據類型創建另外一個activity的對象。
五、後臺Activity被系統回收怎麼辦,如何保存回收前狀態?
1、原因:除了在棧頂的activity,其他的activity都可能在內存不足的時候被系統回收,一個activity越處於棧底,被回收的機率愈大。
2、解決:可以每隔一段時間保存一次,保存到本地。下次啓動時恢復。
3、回收場景:
1)資源相關的系統配置發生改變導致Activity被殺死並重新加載,如:橫豎屏切換,鍵盤的顯示與隱藏。
2)內存資源不足時導致低優先級的Activity被殺死
3)按下Home建
4)啓動另一個activity
4、onSaveInstanceState()方法只適合保存瞬態數據, 比如UI控件的狀態, 成員變量的值等。而不應該用來保存持久化數據,持久化數據應該當用戶離開當前的 activity時,在 onPause() 中保存(比如將數據保存到數據庫或文件中)。說到這裏,還要說一點的就是在onPause()中不適合用來保存比較費時的數據,所以這點要理解。
六、其他
1、Activity的跳轉分類:顯式跳轉,隱式跳轉
2、隱藏標題欄
1)標題欄:Android4.0加入了Action Bar,但是可能覺得標題欄佔用屏幕空間,使得內容區域變小
2)在setContentView()之前加上:requestWindowFeature(Window.FEATURE_NO_TITLE);
3、要注意的是:Activity,Service,Application是ContextWrapper的三個子類