Android一個APK多個入口(多個桌面圖示)的實現
阿新 • • 發佈:2019-02-10
前言
Android應用一般都是一個APK一個桌面圖示,但有時候我們需要實現一個APK在桌面上有多個圖示(比如BAT的某些應用,有桌面快捷方式),對於這種一個APK需要在桌面上顯示多個圖示的,通常有兩種方法來實現:
1. 進入程式後生成桌面快捷方式,這個適合於在程式執行之後生成桌面圖示;
2. 在AndroidManifest.xml檔案中配置多個入口,這個適合於程式安裝完成後就在桌面上顯示多個圖示。
在桌面生成快捷方式,具體實現方式可參見:
1. 總結:android 建立快捷方式的兩種方式+判斷是否已經建立+刪除快捷方式
2. Android create shortcuts on the home screen
本文介紹第二種方式,在程式安裝完成後就會在桌面顯示多個圖示,這種方式適合於多個模組功能一樣,但裡面內容不一樣(比如教材資料)的情況。
具體實現
需要注意的是,為Activity指定process屬性後,還必須為其指定launchMode為singleInstance,這樣才有效。除了為Activity指定android:process屬性外,還可以通過為Activity指定別名的方式實現同樣的效果,具體參見:activity-alias。
存在的問題
1. 因為多個圖示共用一個包名,所以只要解除安裝一個程式,與這個APK包名相同的程式也都會在桌面上消失;
2. 從其它應用跳轉到該APK時,需要通過ACTION區分跳轉到具體哪一個模組(比如從資源管理器選擇一個數據時,到底開啟哪一個應用,需要通過action加以區分);
3. 由於多個圖示、splash、標題等需要區分的資源都放在一個APK中,這無形之中增加了APK的大小。
Android應用一般都是一個APK一個桌面圖示,但有時候我們需要實現一個APK在桌面上有多個圖示(比如BAT的某些應用,有桌面快捷方式),對於這種一個APK需要在桌面上顯示多個圖示的,通常有兩種方法來實現:
1. 進入程式後生成桌面快捷方式,這個適合於在程式執行之後生成桌面圖示;
2. 在AndroidManifest.xml檔案中配置多個入口,這個適合於程式安裝完成後就在桌面上顯示多個圖示。
在桌面生成快捷方式,具體實現方式可參見:
1. 總結:android 建立快捷方式的兩種方式+判斷是否已經建立+刪除快捷方式
2. Android create shortcuts on the home screen
本文介紹第二種方式,在程式安裝完成後就會在桌面顯示多個圖示,這種方式適合於多個模組功能一樣,但裡面內容不一樣(比如教材資料)的情況。
具體實現
在Android應用程式中,我們是通過給Activity標籤中加入下面的intent-filter來指定程式的入口的,如果一個APK要有多個入口,自然而然地想到AndroidManifest.xml檔案中會存在多個包含如下標籤的Activity,所以我們需要做的僅僅是如何區分每一個桌面圖示對應哪一個入口。
Activity有一個重要的屬性process,這個屬性是指定Activity執行時所在的程序。沒有指定此屬性的話,所有程式元件執行在應用程式預設的程序中,這個程序名跟應用程式的包名一致。在AndroidManifest.xml檔案中所有元件元素的process屬效能夠為該元件設定一個新的預設值。但是任何元件都可以覆蓋這個預設值,允許你將你的程式放在多程序中執行。如果這個屬性被分配的名字以:開頭, 當這個Activity執行時, 一個新的專屬於這個程式的程序將會被建立。所以可以通過給每一個Activity指定標籤、圖示和程序名來區分不同的入口,具體實現如下:<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
<activity android:name=".PreSchoolChildActivity" android:label="@string/pre_school_child_app_name" android:process=":process.main" android:icon="@drawable/preschoolchild_launcher" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".EnglishSpellActivity" android:label="@string/english_spell_app_name" android:process=":process.sub" android:launchMode ="singleInstance" android:icon="@drawable/englishspell_launcher" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
需要注意的是,為Activity指定process屬性後,還必須為其指定launchMode為singleInstance,這樣才有效。除了為Activity指定android:process屬性外,還可以通過為Activity指定別名的方式實現同樣的效果,具體參見:activity-alias。
存在的問題
1. 因為多個圖示共用一個包名,所以只要解除安裝一個程式,與這個APK包名相同的程式也都會在桌面上消失;
2. 從其它應用跳轉到該APK時,需要通過ACTION區分跳轉到具體哪一個模組(比如從資源管理器選擇一個數據時,到底開啟哪一個應用,需要通過action加以區分);
3. 由於多個圖示、splash、標題等需要區分的資源都放在一個APK中,這無形之中增加了APK的大小。