天天看點

一個apk多個ICON執行入口

一個工程對應一個AndroidManifest.xml檔案,這個檔案中包含有該項目的一些設定,如權限、SDk版Activity、Service資訊等。一般而言,這個檔案中會有且僅有一個application節點,這個節點表示這是一個應用程式,不管它下面還有多少子節點如Activity、Service等等。形象的說,就是這個項目生成的apk安裝到Android裝置後,應用程式清單中會出現一個ICON,這個ICON就是這個程式的執行入口了。

但是,某些情況下,我們需要為我們的apk設定多個執行入口,也就是安裝後在應用程式清單中出現多個ICON圖示,各個ICON是APP不同子產品的入口點,并且各個子產品運作在不同的程序中。

可能這種需求很少見,但還是有一個現實的例子:系統中的聯系人和電話這兩個程式。表面看來這是兩個獨立的應用程式,但實際上它們隻是一個應用程式的兩個執行入口而已,點選聯系人圖示就會進入聯系人界面,點選電話圖示就會進入撥号界面,這都是通過設定該項目下Activity的屬性來實作的。

Activity有一個重要的屬性process,這個屬性是指定Activity運作時所在的程序。沒有指定此屬性的話,所有程式元件運作在應用程式預設的程序中,這個程序名跟應用程式的包名一緻。中所有組建元素的process屬性能夠為該元件設定一個新的預設值。但是任何元件都可以覆寫這個預設值,允許你将你的程式放在多程序中運作。如果這個屬性被配置設定的名字以:開頭, 當這個activity運作時, 一個新的專屬于這個程式的程序将會被建立。

以下面的代碼為例,項目中有兩個Activity,其中一個采用預設屬性,另一個為其指定process屬性以及新的ICON,這樣該項目安裝到裝置上之後可以發現多了兩個應用程式圖示,一個是應用程式預設的圖示,點選後進入HelloWorldActivity;另一個是手動指定的ICON,點選後進入NextPageActivity。這時使用adb shell檢視程序可以發現,兩個Activity是運作在不同的程序中的。

<activity android:name=".HelloWorldActivity"  
          android:label="@string/app_name"  
          android:process=":process.main">  
         <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
         </intent-filter>  
</activity>  
   
<activity android:name="cn.ian.NextPageActivity"  
      android:label="@string/nextpage"  
      android:process=":process.sub"  
      android:icon="@drawable/icon1"  
      android:launchMode ="singleInstance">  
     <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
         </intent-filter>  
</activity>