Android開發總結之Activity

1 Activity 是什麼

GUI,界面,與用戶交互的可視接口。
當然Fragment,View也是,不過我把它看作是控件,Activity是開發中最基本的容器(窗口)。

2 Activity任務棧

目的是便於管理Activity生命週期。
新啓動的Activity會壓入棧頂,而處於棧頂的Activty處於Active活躍狀態,即可以和用戶做交互(可見可交互)。壓在下面的Activity則處於可見不可交互,或不可見不可交互狀態,並且系統可能會因爲內存不足原因優先回收掉任務棧最下面的Activity,所以也有被回收狀態。

3 Activity4種形態

  • Active:Activity處於棧頂
  • Paused:可見但不可交互
  • Stopped:不可見
  • Killed: 系統回收

4 Activity生命週期

4.1 正常情況下:

  • onCreate():可做初始化
  • onStart():處於可見不可交互狀態
  • onResume():處於可見可交互狀態
  • onPause():即將處於可見不可交互狀態
  • onStop():即將處於停止或被新Activity覆蓋掉
  • onDestroy():即將被銷燬,可做一些資源釋放
  • onRestart():正在重新啓動

4.1.1 通常流程:

  • 啓動一個新Activity A:
    • A.onCreate()->A.onStart()->A.onResume()
  • 當前界面A跳轉到另一個新界面B:
    • A:onPause()->onStop()
    • B:onCreate()->onStart()->onResume()
  • 當前界面B返回:
    • B:onPause()->onStop()->onDestroy()
    • A:onRestart()->onResume()
  • 當前界面A彈出一對話框:
    • A:onPause()
  • 當前界面A彈出的對話框消失:
    • A:onResume()

4.2 異常情況下:

1.資源相關的系統配置發生改變導致Activty被殺死並重新創建
2.資源內存不足導致低優先級的Activity被殺死

擴展:進程優先級

  • 前臺:處於前臺和用戶交互的activity或者和前臺進程Activity綁定的Service所處的進程
  • 可見:處於可見,但不處於前臺,用戶不可以交互的進程
  • 服務:後臺開啓的Service服務
  • 後臺:點擊了Home,前臺進程變爲後臺進程

當Activity異常被回收的情況下,系統會調用onSaveIntanceState(Bundle),重新啓動時會調用onRestoreInstanceState(Bundle),所以可以在Bundle做一些數據保存和恢復的工作。

  • onSaveIntanceState():保存當前狀態數據
  • onRestoreInstanceState:恢復之前保存的數據

數據恢復:onCreate()與onRestoreInstanceState()區別:

onCreate()需要判空,onRestoreInstanceState不需要。

5 Activity啓動模式

啓動模式簡單來說就是定義Activity實例與Activity任務棧的關聯方式。

目的:

  • 讓某些Activity可以啓動一個新的任務棧
  • 讓activity複用,而不是啓動一次就重新創建一個實例

設置方式:

  • 通過Manitest文件配置,比如通過設置指定Activity的android:launchMode="standard"屬性
  • Intent設置Flag標誌
    • FLAG_ACTIVITY_NEW_TASK:指定爲singleTask模式
    • FLAG_ACTIVITY_SINGLE_TOP:指定爲singleTop模式
    • FLAG_ACTIVITY_CLEAR_TOP:標識此Activity,當它啓動時,在同一個任務棧中位於它上面的Activity都要出棧
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:標識此Activity不會出現在歷史Activity的列表中

有哪些啓動模式?

  • standard 標準模式:總會爲activity創建一個新的實例,並將該實例添加到當前task棧中,這種方式不會啓動新的Task棧,只是將新的 Activity添加到原有的Task棧中。
  • singleTop:棧頂複用模式,這種模式下,如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時他的onNewIntent方法會被回調。
  • singleTask:棧內複用模式。如果系統會尋找Activity想要的任務棧,如果沒有則創建一個任務棧,然後放入實例Activity;如果任務棧存在,且已有實例,則系統會將它調到棧頂,在它之上的activity會被彈出,如果實例不存在,則和singTop一樣。
  • singleInstance:單實例模式,此種模式的Activity只能單獨的位於一個任務棧中

5.1 什麼是Activity所需的任務棧?

TaskAffinity(任務相關性),這個參數標識了一個Activity所需要的任務棧的名字,默認情況下,所有Activity所需的任務棧的名字爲應用的名字。所有我們可以通過設置TaskAffinity爲每個Activity單獨指定任務棧。

6 IntentFilter的匹配規則

啓動Activity就兩種,顯示調用和隱式調用。

6.1 顯示調用

即在Intent中,顯示傳入要跳轉的組件類名。這種方式比較簡單直接,但也造成了關聯耦合。

6.2 隱式調用

這樣調用方式的好處是我不必知道我的目標組件具體的名字,只要有組件滿足我設置的過濾條件即可找到我想要的組件。這種方式廣泛應用在模塊化開發,解決了模塊之間的跳轉問題。

隱式調用需要Intent能夠匹配目標組件的IntentFilter中設置的過濾信息,如果不匹配將無法啓動目標組件。IntentFilter中的過濾信息包括action、category、data

  • 匹配組件規則:一個組件中可以配置多個IntentFilter,只有intent匹配其中一個IntentFilter即可啓動。
  • 匹配IntentFilter規則
    • action的匹配規則:action是個字符串,區分大小寫。一個過濾規則中可以有多個action,只要Intent中的action設置有,且能夠和過濾規則中的任何一個action相同即可匹配成功。系統已預定義了一些常見的action,需要使用系統的組件時會用到。
    • categary的匹配規則:一個intentFilter可以有多個category,但是要匹配intentFilter,那麼intent可以無category,如果有則每個category都必須匹配intentFilter裏的category。因爲startActivity裏系統會自動加上"android.intent.category.DEFAULT"這個category,所以intent可以不加category也可以匹配上intentFilter。所以如果組件要能夠隱式調用,intentFilter裏必須加上這個默認category。
    • data的匹配規則:data與action類似,如果過濾規則中定義了data,那麼Intent中必須定義可匹配的data.

6.2.1 data的結構

    <data android:scheme="string"
          android:host="string"
          android:port="string"
          android:path="string"
          android:pathPattern="string"
          android:pathPrefix="string"
          android:mimeType="string"
    />

清單文件中,如果data僅指定了mimeType,沒有指定URI,則data中URI的scheme的默認值爲file和content,所以Intent中URI的scheme也必須爲file或content才能匹配到。

類似URI的結構,就是匹配URI的。

URI結果:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

6.2.2 隱式調用判斷匹配成功與否?

使用PackageManager的兩種方法判空。

public abstract List<ResolveInfo> queryIntentActivities(Intent intent,int flags);
public abstract ResolveInfo resolveActivity(Intent intent,int flags);

第二個flag參數使用MATCH_DEFAULT_ONLY時,表示僅僅匹配那些在intent-filter中聲明瞭android.intent.category.DEFAULT這個category的組件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章