應用作的匆忙,不少地方只顧實現功能,沒有兼顧好性能,因此停下來重構代碼優化性能,結果在打log看啓動時間的時候,發現Application的onCreate執行了屢次,這樣致使重複初始化資源,初始化了3次致使接近1s時間。android
發現這個是由獨立進程引發的。即:process這個屬性。
android:process
服務所在進程的名字。一般,一個應用的全部組件都運行在系統爲這個應用所建立的默認進程中。這個默認進程是用這個應用的包名來命名的。
標籤的process屬性能夠設置成和全部組件都不一樣的默認值。可是這些組件能夠經過設置本身的process值來覆寫這個默認值,這樣可讓你的應用跨多進程運行。
若是被設置的進程名是以一個冒號開頭的,則這個新的進程對於這個應用來講是私有的,當它被須要或者這個服務須要在新進程中運行的時候,這個新進程將會被建立。若是這個進程的名字是以小寫字符開頭的,則這個服務將運行在一個以這個名字命名的全局的進程中,固然前提是它有相應的權限。這將容許在不一樣應用中的各類組件能夠共享一個進程,從而減小資源的佔用。
例如一個應用運行在進程com.aoyousatuo.example中,android:process屬性設置爲com.rabbit.man,則新的進程名字爲com.rabbit.run.性能
通常狀況下一個服務沒有本身獨立的進程,它通常是做爲一個線程運行於它所在的應用的進程中。可是也有例外,Android聲明文件中的android:process屬性卻能夠爲任意組件包括應用指定進程,換句話說,經過在聲明文件中設置android:process屬性,咱們可讓組件(例如Activity, Service等)和應用(Application)建立並運行於咱們指定的進程中。
若是咱們須要讓一個服務在一個遠端進程中運行(而不是標準的它所在的apk的進程中運行),咱們能夠在聲明文件中這個服務的標籤中經過android:process屬性爲其指定一個進程。
注意:這裏選擇」remote」這個名字是隨意主觀的,你能用其餘名字來讓這個服務在另外的進程中運行。冒號’:’這個前綴將把這個名字附加到你的包所運行的標準進程名字的後面做爲新的進程名稱。好比我這裏有一個百度地圖的服務,設置以下:
解決方法以下:this
String processName = OtherUtils.getProcessName(this, android.os.Process.myPid());
android.util.Log.e(TAG, "processName: " + processName);線程
if (processName != null) { boolean defaultProcess = processName.equals(Constant.REAL_PACKAGE_NAME); if (defaultProcess) { //必要的初始化資源操做 initOnce(); } } public static String getProcessName(Context cxt, int pid) { ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); if (runningApps == null) { return null; } for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) { if (procInfo.pid == pid) { return procInfo.processName; } } return null; }