在android的應用程序能夠有多個Activity,每一個Activity是同級別的,那麼在啓動程序時,最早啓動哪一個Activity呢?有些程序可能須要顯示在程序列表裏,有些不須要。怎麼定義呢?java
android.intent.action.MAIN 決定應用程序最早啓動的Activity 。
android.intent.category.LAUNCHER決定應用程序是否顯示在程序列表裏。android
由於你的程序可能有不少個activity,
只要xml配置文件中有這麼一個intent-filter,並且裏面有這個launcher,那麼這個activity就是點擊程序時最早運行的那個activity。app
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <!-- <category android:name="android.intent.category.LAUNCHER" /> --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter>
intent必定要有的3個匹配值, action, category, data.
發送了這個intent以後,android會去系統裏保存的MainManifest.xml清單(假設這個系統存放所有apk清單的文件爲MainManifest.xml)裏查找符合這兩個屬性的activity,而後啓動它。ide
當某個Activity用startActivity(intentOther)方法向系統發送了一個intent(假如爲 intentOther),那麼android系統會去查找這個MainManifest.xml裏註冊的<intent-filter >屬性,測試
查找到符合這個 intentOther 的就啓動這個Activity,若是有多個這樣的Activity符合條件的話,就跳出一個對話框讓用戶選擇究竟要啓動哪個this
<!-- display missed call --> <activity-alias android:name="@string/missedcallactivity" android:icon="@drawable/missing_icon" android:label="@string/missedcallactivity" android:targetActivity=".CustomLinphoneDialer" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias>
這個代碼 能顯示兩個圖標 ,咱們的目的是 能顯示通話記錄, 還得調用target activity, and show call history activity.
爲了能支持隱式intent,activity、service和broadcast receiver會包含1到多個intent filter。每一個intent filter描述組件的可接收一組intent的能力。在intent filter中,說明了可接受的類型,以及不想要的intent。隱式的intent要想投遞到一個組件,只需經過組件的一個filter便可。url
組件把filter分紅多個,是爲了針對具體不一樣的任務。在sample中的Note pad示例中,NoteEditor activity有兩個filter,一個用於啓動並打開指定的note,另外一個是爲了打開新的空的note。code
一個intent filter是一個IntentFilter類的實例。可是,android系統必須在組件未啓動的狀況下就知道它的能力,所以intent filter通常不會在java代碼中設置,而是在應用的manifest文件中做爲<intent-filter>元素的方式聲明。一個例 外是,爲broadcast receiver註冊動態的filter,能夠調用Context.registerReceiver()方法,經過直接實例化IntentFilter 對象建立。xml
filter有三個平等的部分:action、data和category。隱式intent將測試這三個部分。一個intent要想投遞到一個組 件,那麼這三個測試都要經過才行。固然若是組件有多個intent filter,可能一個intent沒有經過,可是經過了另外的一個,這樣也能夠把intent投遞到組件。對象
action測試在intent filter中能夠包含多個action,好比:
<intent-filter . . . >
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
. . .
</intent-filter>
要想經過測試,intent中的action名稱要匹配其中之一。
若是intent filter中不包含action列表,而intent指定action,那麼intent沒有匹配的action,不經過;intent未指定action,而intent filter指定,會自動經過測試。
category測試在intent filter中可包含category列表:
<intent-filter . . . >
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
. . .
</intent-filter>
intent想經過測試,必須匹配一個intent filter中的category。
原理上講,intent若是沒有category設置,那麼老是能夠經過測試。這基本上是正確的,可是有一個例外。Android在爲全部隱式 intent執行startActivity()方法的時候,會認爲它們至少包含了一個 android.intent.category.DEFAULT。所以,若是activity想收到隱式intent,必須加入這個category。
date測試data元素在intent filter元素中,能夠重複屢次(action和category不容許重複的),也能夠根本沒有。好比:
<intent-filter . . . >
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="audio/mpeg" android:scheme="http" . . . />
. . .
</intent-filter>
在data元素中指定uri和數據類型(MIME類型)。uri是被分開表示的:
scheme://host:port/path
其中host和port是關聯的,若是host沒有設置,port也會忽略。
全部這些屬性都是可選的,可是不是獨立的。好比,若是要設置path,那麼也必須設置schema、host和port。
在比較intent中的uri和intent filter中指定的uri時,只會比較intent filter中說起的URL部分。好比,intent filter中只說起了schema,那麼全部url包含這個schema的都匹配。在filter的path部分可使用通配符作到靈活的匹配。
mimeType屬性,比uri方式更經常使用。intent和intent filter均可以使用mime通配符的方式,好比,text/*。
若是既有mimeType,又有uri的狀況,比較規則以下:
<activity-alias 72 + android:description="@string/history" 73 + android:icon="@drawable/ic_launcher_history" 74 + android:label="@string/history" 75 + android:name="CustomHistoryActivity" 76 + android:targetActivity=".CustomLinphoneDialer" > 77 + <intent-filter > 78 + <action android:name="android.intent.action.MAIN" /> 79 + 80 + <category android:name="android.intent.category.LAUNCHER" /> 81 + </intent-filter> 82 + 83 + <meta-data 84 + android:name="dltype" 85 + android:value="@string/dialer_history" > 86 + </meta-data> 87 + </activity-alias>
程序中 判斷處理
private void getlauncherFlag() { 819 » » // get launcher flag 820 » » try { 821 » » » ActivityInfo info = this.getPackageManager().getActivityInfo( 822 » » » » » getComponentName(), PackageManager.GET_META_DATA); 823 » » » launcherType = info.metaData.getString("dltype"); 824 » » } catch (Exception e) { 825 » » » e.printStackTrace(); 827 » » } 826 » » } 828 » } 827 » }
根據flag作跳轉
private void applistLoginTransferView() { 1537 » » try { 1538 » » » Log.d(TAG, "launcherType=" + launcherType); 1539 » » » if (null != launcherType) { 1540 » » » » if (launcherType.equals(STRING_DIALER_CONTACT)) { 1541 » » » » » transfer2ContactList(); 1542 » » » » } else { 1543 » » » » » if (launcherType.equals(STRING_DIALER_HISTORY)) { 1544 » » » » » » transfer2HistoryList(); 1545 » » » » » } else { 1546 » » » » » » // do nothing. 1547 » » » » » } 1548 » » » » } 1549 » » » } 1550 » » } catch (Exception e) { 1551 » » » e.printStackTrace(); 1552 » » } 1521 » } 1553 » }
transfer2HistoryList();這個transfer2HistoryList是原來的跳起色制,略過。 到此activity-alias實現app另外程序入口並顯示指定view完成。