可能很多項目都會有一個自定義的Application,做一些初始化操作以及全局化的一些數據保存,這時如果程序中定義了遠程服務(android:process=":remote"),Application就會被實例化多次,每個進程實例化一次,所以Application中onCreate也會被執行多次,這肯定是沒必要的,特別是Application bind一個Service的情況。
因為Application是應用程序的入口,也不能定義多個,在AndroidMainfest.xml中定義多個ide都會直接報錯。如果確實需要自定義Application,可以在自定義的Application中通過進程名來區分是哪個進程,然后進行相應的邏輯處理。
獲取進程名的方法:
@Nullable public static String getProcessName(Context context, int pid){ ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); if (runningApps != null && !runningApps.isEmpty()) { for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) { if (procInfo.pid == pid) { return procInfo.processName; } } } return null; }
另外整理了一些Application以及進程相關的知識:
1、Application、Task、Activity之間的關系:

這個就沒必要做文字說明了,很清晰的一個關系圖。
2、進程優先級(5級):
2.1.前台進程 Foreground process
前台進程是用戶當前做的事所必須的進程,如果滿足下面各種情況中的一種,一個進程被認為是在前台:
1.進程持有一個正在與用戶交互的Activity(Activity正處於onResume()的狀態)。
2.進程持有一個Service,這個Service和用戶正在交互的Activity綁定。
3.進程持有一個Service,這個Service是在前台運行的,即它調用了 startForeground()。
4.進程持有一個Service,這個Service正在執行它的生命周期回調函數(onCreate(), onStart(), or onDestroy())。
5.進程持有一個BroadcastReceiver,這個BroadcastReceiver正在執行它的 onReceive() 方法。
殺死前台進程需要用戶交互,因為前台進程的優先級是最高的。
2.2.可見進程 Visible process
如果一個進程不含有任何前台的組件,但是仍然影響着用戶在屏幕上可以看到的內容,就是可見進程。
可見進程滿足下列情況之一:
1.進程持有一個Activity,這個Activity不在前台,但是仍然被用戶可見(處於onPause()調用后又沒有調用onStop()的狀態)。
這種情況發生在,比如,前台的activity打開了一個對話框,這樣activity就會在其后可見。
2.進程持有一個Service,這個Service和一個可見的(或者前台的)Activity綁定。
可見的進程也被認為是很重要的,一般不會被銷毀,除非是為了保證所有前台進程的運行而不得不殺死可見進程的時候。
2.3.服務進程 Service process
如果一個進程中運行着一個service,這個service是通過 startService() 開啟的,並且不屬於上面兩種較高優先級的情況,這個進程就是一個服務進程。
盡管服務進程沒有和用戶可以看到的東西綁定,但是它們一般在做的事情是用戶關心的,比如后台播放音樂,后台下載數據等。
2.4.后台進程 Background process
如果進程不屬於上面三種情況,但是進程持有一個用戶不可見的activity(activity的onStop()被調用,但是onDestroy()沒有調用的狀態),就認為進程是一個后台進程。
后台進程不直接影響用戶體驗,系統會為了前台進程、可見進程、服務進程而任意殺死后台進程。
通常會有很多個后台進程存在,它們會被保存在一個LRU (least recently used)列表中,這樣就可以確保用戶最近使用的activity最后被銷毀,即最先銷毀時間最遠的activity。
2.5.空進程
如果一個進程不包含任何活躍的應用組件,則認為是空進程。
保存這種進程的唯一理由是為了緩存的需要,為了加快下次要啟動這個進程中的組件時的啟動時間。
系統為了平衡進程緩存和底層內核緩存的資源,經常會殺死空進程。
2.6 相關說明
1.Android會盡可能地把進程放在高的優先級。
比如,一個進程擁有一個可見狀態的activity和一個service,這個進程會被認為是可見進程,而不是服務進程。
2.一個進程的等級有可能會因為其他進程的依賴而提高,一個進程服務於另一個進程,則它的優先級不會比它服務的進程優先級低。
比如,A進程中的一個content provider向B進程中的一個客戶提供服務,或A進程中的一個service被綁定在B進程中的一個組件上,則A進程的優先級至少和B進程的優先級一樣高。
3.因為服務進程的優先級比后台進程的優先級高,所以對於一個需要啟動一個長時間操作的activity來說,開啟一個service比創建一個工作線程的方法更好,尤其是對於操作將很可能超出activity的持續時間時。
比如要上傳一個圖片文件,應該開啟一個service來進行上傳工作,這樣在用戶離開activity時工作仍在進行。使用service將會保證操作至少有服務進程的優先級。
有什么不對的地方歡迎討論!
