一個app,多個入口圖標,activity-alias實現多程序入口並顯示指定view完成

需求老是一個接一個。
missed call須要一個單獨的圖標,點擊進入,而missed call 自己在linhone activity中。

思路,使用activity alias。
固然,須要intent啓動activity,也就須要filter

在android的應用程序能夠有多個Activity,每一個Activity是同級別的,那麼在啓動程序時,最早啓動哪一個Activity呢?有些程序可能須要顯示在程序列表裏,有些不須要。怎麼定義呢?java

android.intent.action.MAIN 決定應用程序最早啓動的Activity 。
android.intent.category.LAUNCHER決定應用程序是否顯示在程序列表裏。android

由於你的程序可能有不少個activity,
只要xml配置文件中有這麼一個intent-filter,並且裏面有這個launcher,那麼這個activity就是點擊程序時最早運行的那個activity。app

若是隻有一個Activity,沒有這兩句也能夠。


隱藏icon實際上就是註釋掉intent-filter中的一句
<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.
在某個Activity裏用startActivity()方法發送一個intent,這個intent設定了一些條件,好比用方法setAction(),addCategory()設定了兩個屬性,

  發送了這個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 filter?  下面reference a  link to explan intent filter.
Intent filter

爲了能支持隱式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的狀況,比較規則以下:

  • 若是intent和intent filter都沒有設置任何uri和mimetype,經過;
  • intent包含uri可是沒有data type的狀況,intent filter的uri部分與之匹配,並且也沒有data type部分,能夠經過,好比mailto:和tel:
  • intent對象包含數據類型可是沒有uri部分,那麼僅當intent filter也只有數據類型,而沒有uri部分的時候能經過;
  • intent對象包括uri和數據類型(或者數據類型在uri中),分兩部分測試,intent對象的數據類型要匹配intent filter,intent對象的uri,或者匹配intent filter中的uri,或者intent filter中沒有uri部分(僅當intent對象的uri是content:或者file:的時候)。

新思路,能夠啓動CustomLinphoneDialer界面,而後在跳轉到呼叫記錄view,
如何跳轉呢?
設置全局flag,而後判斷跳轉,這樣的話就須要在manifest中定義feature 的meta data, 保存要跳轉的view, 並在CustomLinphoneDialer.java中判斷。

所以新的manifest 修改成。
<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>

程序中 判斷處理
在onCreate中判斷出flag值,
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完成。
相關文章
相關標籤/搜索