Activity的生命週期和啓動模式

1、Activity生命週期android

  • onCreate:Activity正在建立,生命週期的第一個方法,須要setContentView加載layout。
  • onRestart:Activity正在從新啓動,當前Activity從不可見重變爲可見的姿態下,onRestart就會被調用。
  • onStart:Activity正在啓動,這時Activity已經可見了,可是尚未出如今前臺。
  • onResume:Activity已經可見了,出如今前臺並開始活動。
  • onPause:Activity正在中止,正常狀況下onStop就會被調用,若是這時快速回到當前Activity,onResume會被調用。
  • onStop:表示Activity即將中止,不能夠處理太耗時的操做
  • onDestroy:表示Activity即將銷燬,生命週期的最後一個回調。


圖:Actvity生命週期切換過程函數

在默認的狀況下,Activity不作特殊的處理,那麼當出現異常或者配置發生改變的狀況下,Activity就會被銷燬並從新建立,其onPause、onStop、onDestory均會被調用,因爲是異常狀況下終止的,系統會調用onSaveInstanceState保存當前Activity的狀態,當Activity重建後,系統調用onRestoreInstanceState恢復以前保存的數據,如圖所示:


圖:異常狀況下Actvity的重建過程佈局

在內存不足致使優先級低的Activity被kill,優先級從高到底有如下三種:字體

  • 前臺Activity,正在和用戶交互的Activity,優先級最高
  • 可見但非前臺的Activity,好比彈出一個對話框,致使Activity可見可是位於後臺沒法和用戶直接交互
  • 後臺Activity,已經被暫停的Activity,好比執行了onStop,優先級最低

在系統配置發生改變了,不重建Activity,能夠設置android:configChanges參數。在當所指定屬性(Configuration Changes)發生改變時,通知程序調用onConfigurationChanged()函數。設置方法:將下列字段用「|」符號分隔開,例如:「locale|navigation|orientation」ui

  • mmc 移動國家號碼,由三位數字組成,每一個國家都有本身獨立的MCC,能夠識別手機用戶所屬國家
  • mnc 移動網號,在一個國家或者地區中,用於區分手機用戶的服務商,中國移動TD系統爲00,聯通爲01,電信爲03
  • locale 所在地區發生變化,通常只切換系統語言
  • touchscreen 觸摸屏已經改變,這不該該常發生,能夠忽略它
  • keyboard 鍵盤模式發生變化,例如:用戶接入外部鍵盤輸入
  • keyboardHidden 用戶打開手機硬件鍵盤
  • navigation 系統導航方式發生了改變,不常常發生,可忽略
  • orientation 設備旋轉,橫向顯示和豎向顯示模式切換
  • fontScale 全局字體大小縮放發生改變
  • screenLayout 屏幕布局發生了改變,激活了另一個顯示設備
  • uiMode 用戶界面模式發生了改變,好比啓用夜間模式
  • screenSize 屏幕尺寸發生了改變,例如旋轉屏幕
  • smallestScreenSize 設備的物理屏幕尺寸發生改變,和屏幕方向不要緊,例如切換到外部顯示設備
  • layoutDirection 佈局發生變化時,使用的較少

2、啓動模式code

啓動模式簡單地說就是Activity啓動時的策略,在AndroidManifest.xml中的標籤的android:launchMode屬性設置;啓動模式有4種,分別爲standard、singleTop、singleTask、singleInstancexml

  • standard:標準模式,每次啓動一個Activity都會從新建立一個新的實例,onCreate、onStart、onResume都會被調用,以下圖

  • singleTop:棧頂複用模式,若是Activity已經位於棧頂,那麼此Activity不會被從新建立,同時它的onNewIntent方法會被回調,但不是位於棧頂,因而從新生成一個實例,以下圖

  • singleTask:棧內複用模式,這是一種單列模式,只要Activity在一個棧中存在,那麼屢次啓動此Activity都不會從新建立,和singleTop同樣,系統也會回調其onNewIntent,以下圖

  • singleInstance:單實例模式,這是一種增強的singleTop模式,具備其特性,但此模式只能單獨位於一個任務棧中,會從新建立任務棧,以下圖

3、IntentFilter匹配規則生命週期

啓動Activity分爲兩種,顯示和隱式調用,爲了匹配過濾列表,須要同時匹配過濾列表中的action、category、data信息,不然匹配失敗。內存

  • action的匹配規則:區分大小寫的字符串,一個intent-filter能夠包含一個或多個action,Intent中的action與其中的任一個action在字符串形式上徹底相同,action方面就匹配成功。須要注意的是,隱式Intent必須指定action。例如:Manifest文件某個activity中定義了以下Intent Filter:
<intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_TO"/>
    </intent-filter>
那麼只要Intent的action爲「SEND」或「SEND_TO」,那麼這個Intent在action方面就能和上面那個   Activity匹配成功。好比咱們的Intent定義以下:
Intent intent = new Intent("android.intent.action.SEND") ;
    startActivity(intent);
  • category的匹配規則:區分大小寫的字符串,一個intent-filter能夠包含任意數量的category。category和action的匹配不同,要求Intent能夠沒有category,但若是有設置category,每一個都要跟過濾規則中的任意一個相同。例如:
<intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  • data的匹配規則:data由兩部分組成,mimeType(媒體類型)和URI,一個intent-filter裏面能夠有任意數量的data,一個intent只能攜帶一個data(和type)。要求Intent中必須含有data數據,而且data數據可以徹底匹配過濾規則中的某一個data。例如:
<intent-filter>  
        <action android:name="android.intent.action.VIEW"></action>  
        <category android:name="android.intent.category.DEFAULT"></category>  
        <data android:scheme="http"></data>  
    </intent-filter>
相關文章
相關標籤/搜索