標籤:守護進程 android lis 行資料 進程 列印 xtend 個數 建立
轉自:http://blog.csdn.net/spencer_hale/article/details/54968092
1.怎樣用多進程
Android多進程概念:一般情況下,一個應用程式就是一個進程,這個進程名稱就是應用程式套件組合名。我們知道進程是系統分配資源和調度的基本單位,所以每個進程都有自己獨立的
資源和記憶體空間,別的進程是不能任意訪問其他進程的記憶體和資源的。
如何讓自己的應用擁有多個進程:
四大組件在AndroidManifest檔案中註冊的時候,有個屬性android:process這裡可以指定組件的所處的進程。
預設就是應用的主進程。指定為別的進程之後,系統在啟動這個組件的時候,就先建立(如果還沒建立的話)這個進程,然後再建立該組件。列印出它的進程名稱:重
載Application類的onCreate方法即可。
設定android:process屬性,要注意:如果是android:process=”:deamon”,以:開頭的名字,表示這是一個應用程式的私人進程,否則它是一個全域進程。私人進程的進程名稱是
會在冒號前自動加上包名,而全域進程則不會。一般我們都是有私人進程,很少使用全域進程。
2.用多進程的好處
好處:
(1)分擔主進程的記憶體壓力。
當應用越做越大,記憶體越來越多,將一些獨立的組件放到不同的進程,它就不佔用主進程的記憶體空間了。當然還有其他好處,有心人會發現
(2)使應用常駐後台,防止主進程被殺守護進程,守護進程和主進程之間相互監視,有一方被殺就重新啟動它。
Android後台進程裡有很多應用是多個進程的,因為它們要常駐後台,特別是即時通訊或者社交應用,不過現在多進程已經被用爛了。
典型用法是在啟動一個不可見的輕量級私人進程,在後台收發訊息,或者做一些耗時的事情,或者開機啟動這個進程,然後做監聽等。
#壞處:消耗使用者的電量。
多佔用了系統的空間,若所有應用都這樣佔用,系統記憶體很容易佔滿而導致卡頓。
應用程式架構會變得複雜,因為要處理多進程之間的通訊。這裡又是另外一個問題了。
3.多進程的缺陷
進程間的記憶體空間是不可見的。開啟多進程後,會引發以下問題:
1)Application的多次重建。
2)靜態成員的失效。
3)檔案分享權限設定問題。
4)斷點調試問題。
4.解決方案
1)針對Application的多次重建:
在Application的onCreate中擷取進程Id來判斷不同進程,然後做不同的事情。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//擷取進程Id
int pid = android.os.Process.myPid();
Log.e("m_tag", "MyApplication onCreate pid is " + pid); //根據進程id擷取進程名稱
String pName = getProcessName(this,pid);
if("com.xyy.processtest".equals(pName)){
//處理該進程的業務
}
}
}
public String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager)
cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
2)針對靜態成員的失效:
使用Intent或者aidl等進程通訊方式傳遞內容,不能用靜態或單例模式。
3)針對檔案分享權限設定問題:
多進程情況下會出現兩個進程在同一時刻訪問同一個資料庫檔案的情況。這就可能造成資源的競爭訪問,導致諸如資料庫損壞、資料丟失等。在多線程的情況下我們有鎖機制控制資源的共用,但是在多進程中比較難,雖然有檔案鎖、排隊等機制,但是在Android裡很難實現。解決辦法就是多進程的時候不並發訪問同一個檔案,比如子進程涉及到操作資料庫,就可以考慮調用主進程進行資料庫的操作。
4)針對斷點調試問題:
調試就是跟蹤程式運行過程中的堆棧資訊,由於每個進程都有自己獨立的記憶體空間和各自的堆棧,無法實現在不同的進程間調試。因此要改為同一進程:調試時去掉AndroidManifest.xml中android:process標籤,這樣保證調試狀態下是在同一進程中,堆棧資訊是連貫的。待調試完成後,再將標籤複原。
Android開發中怎樣用多進程、用多進程的好處、多進程的缺陷、解決方案(轉)