Android 一個apk多個ICON執行入口

方法一:使用Activity的屬性process,不一樣的Activity是運行在不一樣的進程中

一個工程對應一個AndroidManifest.xml文件,這個文件中包含有該項目的一些設置,如權限、SDk版Activity、Service信息等。通常而言,這個文件中會有且僅有一個application節點,這個節點表示這是一個應用程序,無論它下面還有多少子節點如Activity、Service等等。形象的說,就是這個項目生成的apk安裝到Android設備後,應用程序列表中會出現一個ICON,這個ICON就是這個程序的執行入口了。 html

可是,某些狀況下,咱們須要爲咱們的apk設置多個執行入口,也就是安裝後在應用程序列表中出現多個ICON圖標,各個ICON是APP不一樣模塊的入口點,而且各個模塊運行在不一樣的進程中。 linux

可能這種需求不多見,但仍是有一個現實的例子:系統中的聯繫人和電話這兩個程序。表面看來這是兩個獨立的應用程序,但實際上它們只是一個應用程序的兩個執行入口而已,點擊聯繫人圖標就會進入聯繫人界面,點擊電話圖標就會進入撥號界面,這都是經過設置該項目下Activity的屬性來實現的。 android

Activity有一個重要的屬性process,這個屬性是指定Activity運行時所在的進程。沒有指定此屬性的話,全部程序組件運行在應用程序默認的進程中,這個進程名跟應用程序的包名一致。中全部組建元素的process屬性可以爲該組件設定一個新的默認值。可是任何組件均可以覆蓋這個默認值,容許你將你的程序放在多進程中運行。若是這個屬性被分配的名字以:開頭, 當這個activity運行時, 一個新的專屬於這個程序的進程將會被建立。 shell

如下面的代碼爲例,項目中有兩個Activity,其中一個採用默認屬性,另外一個爲其指定process屬性以及新的ICON,這樣該項目安裝到設備上以後能夠發現多了兩個應用程序圖標,一個是應用程序默認的圖標,點擊後進入HelloWorldActivity;另外一個是手動指定的ICON,點擊後進入NextPageActivity。這時使用adb shell查看進程能夠發現,兩個Activity是運行在不一樣的進程中的。 app

AndroidManifest.xml的主要內容以下: 性能

 
  1. 1.<activity Android:name=".HelloWorldActivity"
  2. 2. Android:label="@string/app_name"
  3. 3. Android:process=":process.main">
  4. 4. <intent-filter>
  5. 5. <action Android:name="android.intent.action.MAIN" />
  6. 6. <category Android:name="android.intent.category.LAUNCHER" />
  7. 7. </intent-filter>
  8. 8.</activity>
  9. 9.
  10. 10.<activity Android:name="cn.ian.NextPageActivity"
  11. 11. Android:label="@string/nextpage"
  12. 12. Android:process=":process.sub"
  13. 13. Android:icon="@drawable/icon1"
  14. 14. Android:launchMode ="singleInstance">
  15. 15. <intent-filter>
  16. 16. <action Android:name="android.intent.action.MAIN" />
  17. 17. <category Android:name="android.intent.category.LAUNCHER" />
  18. 18. </intent-filter>
  19. 19.</activity>

經過上面的方式,爲App的各個組件指定process和icon屬性,便可以達到相似於一個apk中打包多個程序(模塊)的目的。 spa

ps:要特別注意,爲Activity指定process屬性後,還必須爲其指定launchMode爲singleInstance,這樣纔有效 .net

 

方法二:使用activity-alias 設計

 

activity-alias是android裏爲了重複使用Activity而設計的。 code

當在Activity的onCreate()方法裏,執行getIntent().getComponent().getClassName();獲得的可能不是這個Activity的名字,有多是別名的名字,例如:在AndroidMenifest.xml有以下配置:

[xhtml]   view plain copy
  1. <activity  
  2.     android:name=".TestAndroid" 
  3.     android:icon="@drawable/ic_menu_mark"> 
  4.         <intent-filter> 
  5.             <action android:name="android.intent.action.MAIN" /> 
  6.             <category android:name="android.intent.category.LAUNCHER" /> 
  7.         </intent-filter> 
  8. </activity> 
[xhtml]   view plain  copy
  1. <activity   
  2.     android:name=".TestAndroid"  
  3.     android:icon="@drawable/ic_menu_mark">  
  4.         <intent-filter>  
  5.             <action android:name="android.intent.action.MAIN" />  
  6.             <category android:name="android.intent.category.LAUNCHER" />  
  7.         </intent-filter>  
  8. </activity>  
[xhtml]   view plain copy
  1. <activity-alias  
  2.     android:name="TestAndroidAlias" 
  3.     android:targetActivity="TestAndroid" 
  4.     android:label="testAndroidlias" 
  5.     android:icon="@drawable/ic_launcher_phone"> 
  6.         <intent-filter> 
  7.             <action android:name="android.intent.action.MAIN" /> 
  8.             <category android:name="android.intent.category.DEFAULT" /> 
  9.             <category android:name="android.intent.category.LAUNCHER" /> 
  10.         </intent-filter> 
  11. </activity-alias> 
[xhtml]   view plain  copy
  1. <activity-alias   
  2.    android:name="TestAndroidAlias"  
  3.     android:targetActivity="TestAndroid"  
  4.     android:label="testAndroidlias"  
  5.     android:icon="@drawable/ic_launcher_phone">  
  6.         <intent-filter>  
  7.             <action android:name="android.intent.action.MAIN" />  
  8.             <category android:name="android.intent.category.DEFAULT" />  
  9.             <category android:name="android.intent.category.LAUNCHER" />  
  10.         </intent-filter>  
  11. </activity-alias>  

這個應用會在桌面上建兩個進入點,即建兩個能夠進入TestAndroid這個Activity的快捷圖標。這時getIntent().getComponent().getClassName() 獲得的名字就不同,一個是com.test.TestAndroid,一個是com.test.TestAndroidAlias。

相關文章
相關標籤/搜索