Android到底那個Acitivity啟動

來源:互聯網
上載者:User

啟動那個Acitivity有兩種方式:implicit(隱藏) intent 和 explicit(明確) intent

Explicit Intent

明確的指定了要啟動的Acitivity
比如以下Java代碼,明確指定了要啟動B:
Intent intent= new Intent(this, B.class) 

 

Implicit Intent


沒有明確的指定要啟動哪個Activity ,而是通過設定一些Intent Filter來讓系統去篩選合適的Acitivity去啟動。

當使用startActivity時,隱式Intent解析到一個單一的Activity。如果存在多個Activity都有能力在特定的資料上執行給定的動作的話,Android會從這些中選擇最好的進行啟動。

 

Implicit Intent 到底發給哪個activity?

這需要進行三個匹配,一個是action,一個是category,一個是data。根據三個的匹配結果,找到應該啟動的Activity。

 

Action Implicit Intent

動作匹配指Android Intent Filter包含特定的動作或沒有指定的動作。

一個Intent Filter有一個或多個定義的動作,如果沒有任何一個能與Intent指定的動作匹配的話,這個Intent Filter在算作是動作匹配檢查失敗。

元素中可以包括子項目,比如:





一條元素至少應該包含一個,否則任何Intent請求都不能和該匹配。如果Intent請求的Action和中個某一條匹配,那麼該Intent就通過了這條的動作測試。

Category Implicit Intent

種類匹配更為嚴格。Intent Filter必須包含所有在解析的Intent中定義的種類。一個沒有特定種類的Intent Filter只能與沒有種類的Intent匹配。

元素可以包含


只有當Intent請求中所有的Category與組件中某一個IntentFilter的

Data Implicit Intent

Intent的資料URI中的部分會與Intent Filter中的data標籤比較。如果Intent Filter定義scheme,host/authority,path或mimetype,這些值都會與Intent的URI比較。任何不匹配都會導致Intent Filter從列表中刪除。沒有指定data值的Android Intent Filter會和所有的Intent資料匹配。

  • mimetype是配對的資料的資料類型。當匹配資料類型時,你可以使用萬用字元來匹配子類型(例如,earthquakes/*)。如果Intent Filter指定一個資料類型,它必須與Intent匹配;沒有指定資料的話全部匹配。
  • scheme是URI部分的協議——例如,http:,mailto:,tel:。
  • host-name或“data authority”是介於URI中scheme和path之間的部分(例如,www.google.com)。匹配主機名稱時,Intent Filter的scheme也必須通過匹配。
  • 資料path是緊接在“data authority”的後面(例如,/ig)。path只在scheme和host-name部分都匹配的情況下才匹配。

資料在中的描述如下:




元素指定了希望接受的Intent請求的資料URI和資料類型,URI被分成三部分來進行匹配:scheme、authority和path。其中,用setData()設定的Inteat請求的URI資料類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也需要相匹配才會通過測試。

解析出來後的處理邏輯

如果這個過程中多於一個組件解析出來的話,它們會以優先度來排序,可以在Android Intent Filter的節點裡添加一個可選的標籤。最高等級的組件會返回。

Android本地的應用程式組件和第三方應用程式一樣,都是Intent解析過程中的一部分。它們沒有更高的優先度,可以被新的Activity完全的代替,這些新的Activity宣告自己的Intent Filter能響應相同的動作請求。

 

 

應用程式的啟動

AndroidManifest.xml 檔案中,把那個 activity 配置了 ,那就就是最先被啟動的 Activity ,如果多個設定了,則第一個設定的是最新被啟動的 Activity。

如設定,是 .SplashActivity 先啟動的

http://schemas.android.com/apk/res/android"package="ghj1976.HelloWorld" android:versionCode="1"android:versionName="1.0">3" />@drawable/icon" android:label="@string/app_name">.HelloWorldActivity" android:label="@string/app_name">.SplashActivity" android:label="@string/app_name">android.intent.action.MAIN" />android.intent.category.LAUNCHER" />

上面代碼中的

activity android:name:  activity 的類名,必須有。

android.intent.action.MAIN   決定應用程式最先啟動的Activity

android.intent.category.LAUNCHER     決定應用程式是否顯示在程式列表裡

 

參考資料

Intent Filter匹配

http://www.moandroid.com/?p=1651

什麼時候加上android.intent.category.DEFAULT和LAUNCHER

http://www.crazydevelop.com/content.aspx?ID=6416

Android 開發之:Intent.createChooser() 妙用

http://www.oschina.net/bbs/thread/9299

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.