Android開發中怎樣用多進程、用多進程的好處、多進程的缺陷、解決方案

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.