Android 多進(jìn)程的實(shí)現(xiàn)以及利弊

一、進(jìn)程與線程

  • 進(jìn)程:是程序運(yùn)行的實(shí)例,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,它包括獨(dú)立的地址空間,資源以及1個(gè)或多個(gè)線程。

  • 線程:可以看成是輕量級(jí)的進(jìn)程,是CPU調(diào)度和分派的基本單位。

區(qū)別
  • 1.調(diào)度
    從上面的定義可以看出一個(gè)是調(diào)度和分派的基本單位,一個(gè)是擁有資源的基本單位。

  • 2.共享地址空間,資源
    進(jìn)程擁有各自獨(dú)立的地址空間,資源,所以共享復(fù)雜,需要用IPC,同步簡單; 線程共享所屬進(jìn)程的資源,共享簡單,但同步復(fù)雜,要通過加鎖等措施。

  • 3.占用內(nèi)存,cpu
    進(jìn)程占用內(nèi)存多,切換復(fù)雜,CPU利用率低; 線程占用內(nèi)存少,切換簡單,CPU利用率高。

  • 4.相互影響
    進(jìn)程間不會(huì)相互影響; 一個(gè)線程掛掉會(huì)導(dǎo)致整個(gè)進(jìn)程掛掉。

二、Android應(yīng)用內(nèi)多進(jìn)程的介紹

正常情況下,一個(gè)apk啟動(dòng)后只會(huì)運(yùn)行在一個(gè)進(jìn)程中,其進(jìn)程名為AndroidManifest.xml文件中指定的應(yīng)用包名,所有的基本組件都會(huì)在這個(gè)進(jìn)程中運(yùn)行。但是如果需要將某些組件(如Service、Activity等)運(yùn)行在單獨(dú)的進(jìn)程中,就需要用到android:process屬性了。我們可以為android的基礎(chǔ)組件指定process屬性來指定它們運(yùn)行在指定進(jìn)程中。

好處
  • 1、我們知道Android系統(tǒng)對(duì)每個(gè)應(yīng)用進(jìn)程的內(nèi)存占用是有限制的,而且占用內(nèi)存越大的進(jìn)程,通常被系統(tǒng)殺死的可能性越大。讓一個(gè)組件運(yùn)行在單獨(dú)的進(jìn)程中,可以減少主進(jìn)程所占用的內(nèi)存,降低被系統(tǒng)殺死的概率。

  • 2、如果子進(jìn)程因?yàn)槟撤N原因崩潰了,不會(huì)直接導(dǎo)致主程序的崩潰,可以降低我們程序的崩潰率。

  • 3、即使主進(jìn)程退出了,我們的子進(jìn)程仍然可以繼續(xù)工作,假設(shè)子進(jìn)程是推送服務(wù),在主進(jìn)程退出的情況下,仍然能夠保證用戶可以收到推送消息。

缺陷
  • 1、Application的多次重建
    如果你在項(xiàng)目啟動(dòng)的時(shí)候就啟動(dòng)一些如百度地圖的進(jìn)程,你會(huì)發(fā)現(xiàn)Application onCreate 的打印出現(xiàn)了兩次,而且pid的值也是不一樣的。
public class MyApplication extends Application {  
    public static final String TAG = "viclee";  
    @Override  
    public void onCreate() {  
        super.onCreate();  
        int pid = android.os.Process.myPid();  
        Log.d(TAG, "MyApplication onCreate");  
        Log.d(TAG, "MyApplication pid is " + pid);  
    }  
} 
  • 2、靜態(tài)成員的失效。
    設(shè)置了process屬性后,產(chǎn)生了兩個(gè)隔離的內(nèi)存空間,一個(gè)內(nèi)存空間里值的修改并不會(huì)影響到另外一個(gè)內(nèi)存空間。所以就算是靜態(tài)成員也是兩個(gè)不同的成員值。
  • 3、文件共享問題。
    多進(jìn)程情況下會(huì)出現(xiàn)兩個(gè)進(jìn)程在同一時(shí)刻訪問同一個(gè)數(shù)據(jù)庫文件的情況。這就可能造成資源的競爭訪問,導(dǎo)致諸如數(shù)據(jù)庫損壞、數(shù)據(jù)丟失等。在多線程的情況下我們有鎖機(jī)制控制資源的共享,但是在多進(jìn)程中比較難,雖然有文件鎖、排隊(duì)等機(jī)制,但是在Android里很難實(shí)現(xiàn)。解決辦法就是多進(jìn)程的時(shí)候不并發(fā)訪問同一個(gè)文件,比如子進(jìn)程涉及到操作數(shù)據(jù)庫,就可以考慮調(diào)用主進(jìn)程進(jìn)行數(shù)據(jù)庫的操作。
  • 4、斷點(diǎn)調(diào)試問題。
    調(diào)試就是跟蹤程序運(yùn)行過程中的堆棧信息,由于每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間和各自的堆棧,無法實(shí)現(xiàn)在不同的進(jìn)程間調(diào)試。不過可以通過下面的方式實(shí)現(xiàn):調(diào)試時(shí)去掉AndroidManifest.xml中android:process標(biāo)簽,這樣保證調(diào)試狀態(tài)下是在同一進(jìn)程中,堆棧信息是連貫的。待調(diào)試完成后,再將標(biāo)簽復(fù)原。

二、Android應(yīng)用內(nèi)多進(jìn)程的實(shí)現(xiàn)

只需要添加 android:process 的屬性即可,屬性名可以自定義,相同的屬性名的進(jìn)程在同一個(gè)里面運(yùn)行。

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.example.processtest"  
    android:versionCode="1"  
    android:versionName="1.0" >  
  
    <uses-sdk  
        android:minSdkVersion="8"  
        android:targetSdkVersion="19" />  
  
    <application  
        android:name="com.example.processtest.MyApplication"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name">  
        <activity  
            android:name=".ProcessTestActivity"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
          
        <service  
            android:name=".ProcessTestService"  
            android:process=":remote">  
        </service>  
    </application>  
  
</manifest>  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評(píng)論 25 709
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,320評(píng)論 0 23
  • 我時(shí)常沉默 因?yàn)樗妓?我時(shí)常微笑 因?yàn)檫b望 盛夏揮灑的雨 不帶有任何情緒 如樹蔭下安靜不語的咖啡廳 生機(jī)盎然的是 ...
    天籟村閱讀 146評(píng)論 0 0
  • 前幾天聽到朋友說一個(gè)故事,雖然說這個(gè)事情很早就有,但是我以前在聽的時(shí)候并未在意,但是這次聽朋友重新說起的時(shí)候,我陷...
    周游之閱讀 296評(píng)論 0 0
  • 各位伙伴們,聽說過國內(nèi)的一些商學(xué)院吧,這幾年在高端人群當(dāng)中特別火。我們來看看國內(nèi)部分商學(xué)院EMBA班學(xué)費(fèi)。 中歐國...
    半夏_1854閱讀 1,336評(píng)論 2 2

友情鏈接更多精彩內(nèi)容