Android單應用開多程序與單程序跑多應用
正常情況下,一個apk啟動後只會執行在一個程序中,其程序名為AndroidManifest.xml檔案中指定的應用包名,所有的基本元件都會在這個程序中執行。但是如果需要將某些元件(如Service、Activity等)執行在單獨的程序中,就需要用到Android:process屬性了。我們可以為android的基礎元件指定process屬性來指定它們執行在指定程序中。多程序能突破單程序記憶體大小的控制,防止OOM。
對process屬性的設定有兩種形式: 第一種形式如android:process=":remote",以冒號開頭,冒號後面的字串原則上是可以隨意指定的。如果我們的包名為“com.example.processtest”,則實際的程序名為“com.example.processtest:remote”。這種設定形式表示該程序為當前應用的私有程序,其他應用的元件不可以和它跑在同一個程序中。
第二種情況如 android:process="com.example.processtest.remote",以小寫字母開頭,表示執行在一個以這個名字命名的全域性程序中,其他應用通過設定相同的ShareUID可以和它跑在同一個程序。
由於新開啟程序,所以需注意下面兩點:
1)Application的多次重建。
2)靜態成員的失效。
//舉例
...
<service
android:name=".MyService"
android:label="@string/title_activity_main"
android:process="xxx.service">
</service>
...
二、多應用程式跑同一程序
http://blog.csdn.net/dyllove98/article/details/8836412
http://blog.csdn.net/yanjianjunaaa/article/details/13095087
供參考
使用方法
1、首先在兩個程式的Manifest檔案中的manifest節點下面設定相同的sharedUserId,比如: android:sharedUserId="com.test"
2、在需要獲取資料的程式中建立另外一個程式的上下文引用Context,
Context context = createPackageContext("com.excellence.weather", Context.CONTEXT_IGNORE_SECURITY);其中的第一個引數是另外一個程式的包名,這樣就可以利用這個Context像訪問自己程式的資源一樣訪問被共享的程式的資源,例如:
SharedPreferences sharedPreferences = context.getSharedPreferences(SHAREDPREFERENCES_USERINFO, Context.MODE_WORLD_READABLE);
3、匯出成apk的時候使用相同的簽名
ResourceId 共享方法
1、使用SharedPreferences傳遞
2、使用相同的資源名
三、獲取應用程式開啟程序個數及程序名
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 通過呼叫ActivityManager的getRunningAppProcesses()方法獲得系統裡所有正在執行的程序
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();
ActivityManager.RunningAppProcessInfo類
說明: 封裝了正在執行的程序資訊
常用欄位 :
int pid 程序ID
int uid 程序所在的使用者ID
String processName 程序名,預設是包名或者由android:process=””屬性指定
String [ ] pkgList 執行在該程序下的所有應用程式包名
List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序
ApplicationInfo類
說明: 應用程式相關資訊
常用欄位方法 :
String packageName應用名
String packageName應用包名
String loadLabel()獲取應用標籤
String loadIcon()獲取應用圖示
獲取當前執行的應用程式開啟的程序列表:
1、獲得系統里正在執行的所有程序
2、根據程序的pkgList列表裡所有包名,在安裝的應用目錄下查詢
3、根據查詢到的應用,得到標籤圖示等