1. 程式人生 > >Android單應用開多程序與單程序跑多應用

Android單應用開多程序與單程序跑多應用

一、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、根據查詢到的應用,得到標籤圖示等

相關推薦

Android應用程序程序應用

一、Android應用多程序正常情況下,一個apk啟動後只會執行在一個程序中,其程序名為AndroidManifest.xml檔案中指定的應用包名,所有的基本元件都會在這個程序中執行。但是如果需要將某些元件(如Service、Activity等)執行在單獨的程序中,就需要用

頁面頁面應用的區別

雖然接觸web開發有一段時間了,但從頭開始構建一個完整的web專案的機會非常少,對於一些概念還很模糊,今天首先來梳理一下在應用開發中,單頁面應用和多頁面應用的區別。 其實從字面意思上理解,就很好理解了。 單頁面,顧名思義只有一個介面。 介面是通過URL來定位的,所以單頁面應用從頭到尾

VS win32命令控制臺程序片機串口數據傳輸

基於 坐標 串口通信 編譯 串口配置 開發 大致 bsp 使用 最近有個小的訓練 大致是需要用攝像頭檢測圓,然後把圓的xy坐標發送給單片機。 但是網上大部分都是基於MFC串口控件的例程。大海撈針找到了個win32命令控制臺的串口例程 ,自己改了一下貢獻出來。 直接調用AP

虛擬記憶體swap,使用者使用者,64位32位

一、虛擬記憶體和swap分割槽: 這兩個概念分別對應windows和linux: windows:虛擬記憶體 linux:swap 在windows中即使實體記憶體沒有用完也會去用到虛擬記憶體,而Linux不一樣 Linux只有在實體記憶體用完的時候才

sturts2 action

struts 2的Action是多例項的並非單例,也就是每次請求產生一個Action的物件。原因是:struts 2的Action中包含資料,例如你在頁面填寫的資料就會包含在Action的成員變數裡面。如果Action是單例項的話,這些資料在多執行緒的環境下就會相互影響,例如

廣播、播的原理

Question 這是計算機網路非常基礎的概念,在這裡重點記錄它們的原理和實現方式。我最不能理解的是組播的實現。 基本概念 IP地址的分類 IP地址分為四個級別,A類、B類、C類、D類 A類是IP地址首位以“0”開始的地址,第1至

應用程序驅動程序客服端方式交互

dex etime link next self 時間 ise elf defaults 實現方式是:3 環通過IOServiceOpen打開連接驅動0 環在 start 中設置一個與之交互的Client(方式有設置鍵值對或 new一個Client)3 環:// User

python 程序程序

多程序: 1.os.fork() 2.from multiprocessing import Process 3.form multiprocessing import Pool 子程序: subprocess 很多時候,子程序並不是自身,而是一個外部程序。我們建立了子程序後,還需要控制

Java 程序執行緒 及執行緒實現(Thread、Runnable、Callable)

程序與執行緒的概念 程序: 作業系統中一個程式的執行週期稱為一個程序。(是程式的一次動態執行,它對應著從程式碼載入,執行至執行完畢的一個完整的過程,是一個動態的實體) windows是一個多程序的作業系統。 執行緒: :一個程式同時執行多個任務。通常,每一個任務就稱為一個執行緒。與程序相

程序目標程序

程序 com www 集合 amp follow 文本 clas bsp 源程序也叫源碼,就是最開始編寫的程序,計算機並不能識別,需要經過編譯生成目標程序 目標程序是能夠被計算機識別執行的,比如我們在網上下載的軟件,例如QQ,迅雷,這一類 軟件都是目標程序,

程序程序的執行順序

from multiprocessing import Process import time def task(name): print("%s start" % name) time.sleep(3) print("%s stop" % name) if __name_

Python 中子程序程序

from multiprocessing import Process import time 複製程式碼 從程式中啟動程序的兩種方式: def task(i): print('%s start!'% i) time.sleep(2) print('%s stop!' % i) 複

electron 內主程序渲染程序,webview之間的通訊

   這裡先插個題外話,什麼是程序,為什麼要分主程序子程序?首先程序是資源分配的單位,是執行的程式,一個程序自然只能代表一個程式,多道程式自然而然就產生了多程序的概念。程序中通過CreateProcess()函式去建立一個子程序,子程序在全部處理過程中只對父程序地址空間中的相關資料進行訪問,從而可以保護父程序

Linux 殭屍程序孤兒程序

殭屍程序 產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 程式碼實現殭屍程序 //該程式

孤兒程序殭屍程序

1、前言   之前在看《unix環境高階程式設計》第八章程序時候,提到孤兒程序和殭屍程序,一直對這兩個概念比較模糊。今天被人問到什麼是孤兒程序和殭屍程序,會帶來什麼問題,怎麼解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真

Linux作業系統之程序通訊——使用訊息緩衝佇列實現client程序server程序之間的通訊

使用訊息緩衝佇列來實現client程序和server程序之間的通訊。  問題描述如下: server程序先建立一個關鍵字為SVKEY(如75)的訊息佇列,然後等待接收型別為REQ(如1)的訊息;在收到請求訊息後,它便顯示字串“serving for clien

程序結束,其子程序不會結束,會掛到init程序下 孤兒程序殭屍程序[總結]

結論:一個父程序產生子程序,父程序結束(kill),子程序不會結束,子程序被init程序託管 下面是過程:     d.sh指令碼是一個ping命令,執行d.sh             &nb

UNIX中後臺程序守護程序

守護程序最重要的特性是後臺執行。在這一點上DOS下的常駐記憶體程式TSR與之相似。其次,守護程序必須與其執行前的環境隔離開來。這些環 境包括未關閉的檔案描述符,控制終端,會話和程序組,工作目錄以及檔案建立掩模等。這些環境通常是守護程序從執行它的父程序(特別是shell)中繼承下 來的。最後,守護程序的啟動方式

孤兒程序殭屍程序[總結]

1、前言   之前在看《unix環境高階程式設計》第八章程序時候,提到孤兒程序和殭屍程序,一直對這兩個概念比較模糊。今天被人問到什麼是孤兒程序和殭屍程序,會帶來什麼問題,怎麼解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真總結一下,加深理解。 2、基本概念  

windows遍歷程序殺死程序

windows下遍歷程序有多種方式: 程序快照:CreateToolhelp32Snapshot; 程序狀態API:PSAPI; 在psapi中主要使用到的方法有: EnumProcesses——列舉程序; EnumProcessModules——列舉程序內模組; Get