1. 程式人生 > >Android開發中怎樣用多進程、用多進程的好處、多進程的缺陷、解決方法(轉)

Android開發中怎樣用多進程、用多進程的好處、多進程的缺陷、解決方法(轉)

傳遞 標簽 事情 打印 ide 即時通訊 ice cati 一個數

轉自: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開發中怎樣用多進程、用多進程的好處、多進程的缺陷、解決方法(轉)