帶你重新認識Activity的方方面面

一、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的三個子類

  


  


 

發佈了26 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章