1. 程式人生 > >Android四大元件-Activity

Android四大元件-Activity

目錄

啟動問題:

Activity

一、Activity生命週期

onCreate 進行初始化,比如用setContentView載入佈局
onStart Activity由不可見變為可見,不在前臺、不可互動
onResume Activity位於返回棧的棧頂,出錢在前臺可互動
onPause Activity不可互動,當啟動一個透明的Activity時部分被遮擋住了,所以被擋住的Activity會在此宣告週期
onStop Activity有可見變為不可見
onDestory 銷燬Activity並釋放資源

相信大家學Android Activity第一個接觸到的就是這一個生命週期,那麼想要更好掌握,最好的辦法就是自己在寫程式碼中去體會,一下列一下幾個常見的情況:

二、常見情況:

  1. 啟動問題:

    1. A啟動B之後,A.onPause->B.onCreate->B.onStart->B.Resume->A.onStop,這個生命週期A需要等B啟動完之後才stop,因為Pause完之後A仍然可見,保證不會因此黑屏
    2. A啟動另一個活動B、C獲得資料返回,可以使用startActivityForResult(intent,requestCode)方法,在OnActivityResult(RequestCode,resultCode,intent),這兩個方法主要處理返回的資料,RequestCode可以用來識別是哪個控制元件(按鈕)啟動B活動,而resultCode可以用來識別是哪個活動(B、C)返回的資料,具體使用可見
      https://www.cnblogs.com/linjiqin/archive/2011/06/03/2071956.html
  2. 回收問題:Activity被回收的情況可能如下:

    1. 按Home鍵回到主頁
    2. 啟動其他Activity,長期在後臺
    3. 旋轉螢幕
    4. 按下電源按鍵
    5. PS:返回鍵是直接finish掉Activity
    6. 這些情況中如旋轉螢幕的生命週期是活動殺死後重新啟動
  3. 回收後資料儲存問題:成對出現的onSaveInstanceState、onRestoreInstanceState

    1. onSaveInstanceState是因為不小心被回收之後被呼叫儲存資料,如上幾種情況。保證使用者返回後恢復之前的檢視資料,
    2. onRestoreInstanceState不一定會被呼叫,因為當很快恢復而活動未被殺死的時候此時這個方法不會被呼叫
    3. 恢復的檢視需要設定id,在原始碼中恢復檢視需要通過id找到對應的檢視,如果沒id則恢復不了
  4. Activity配置問題:為了讓Activity不重新建立

    1. 與前幾點有點關係,在configChanges設定是為了保證有變動是Activity不會重啟導致資料變動
    2. 我們先看相對應的屬性:
    3. 上面的屬性中我們可以看到會影響到活動重啟的情況有螢幕旋轉、鍵盤的隱藏,為了保證發生這些情況不會重啟活動,我們通常這樣設定android:configChanges=“orientation”,用得比較多的是locale、orientation、keyboardHidden三個屬性
  5. Activity屬性設定:

    1. android:taskAffinity只有通過標誌位為FLAG_ACTIVITY_NEW_TASK的Intent啟動Activity時,該Activity的這個屬性才會生效,系統才會將具有相同Task親和力的Task切換到前臺,然後啟動該Activity,否則該Activity仍然執行在啟動它的Task中。http://wangkuiwu.github.io/2014/06/26/OtherModeAttrs/
  6. Activity啟動的設定:

    1. Activity中的icon、label用來設定新啟動的活動,但是還是屬於同一個應用,

  7. Activity啟動模式、任務棧:

    1. Activity啟動順序什麼的是安排在一個任務棧之中,任務棧會影響到當按後退按鈕上一個activity是彈出哪一個。

      1. standard:可重複

      2. singleTop:棧頂不能重複

      3. singleTask:任務棧中只能有一個

      4. singleInstance:新建一個任務棧,不能重複

    2. 也可使用Flags來啟動:

      1. Intent.FLAG_ACTIVITY_NEW_TASK:使用一個新的task來啟動Activity,一般在service中啟動Activity

      2. Intent.FLAG_ACTIVITY_SINGLE_TOP:singleTop

      3. Intent.FLAG_ACTIVITY_CLEAR_TOP:singleTask

      4. Intent.FLAG_ACTIVITY_NO_HISTORY:當啟動其他Activity之後就清理

    3. 當在任務棧中啟動已經存在的Activity,會呼叫其onNewIntent()方法,可以在此處理一些東西