關於Android進程知識,你須要知道這些(一)

瞭解進程概念

進程是程序的一次執行,是系統進行資源分配和調度的基本單位,有本身專屬的內存資源。java

進程是操做系統上的概念,因此不管在PC端仍是移動端都是存在的,進程在PC端上,表現爲程序,好比音樂播放器,聊天軟件等;在手機上,就是一個個應用軟件。android

進程與線程區別

先看一張圖編程

從上面這張圖,咱們能夠看出來,進程包含線程。一個進程裏能夠有多個線程,這樣的一個關係。緩存

每一個進程都有一塊屬於本身的由操做系統分配的內存,默認的狀況下,A進程的內存區域不能和其餘進程共享。剛剛用了一個默認狀況的描述詞。說到進程間不能共享數據,這也不是絕對的。在特殊的狀況下也是能夠共享的,這種狀況就是IPC機制。IPC機制全稱叫作:inter-process communication ,即進程間通訊。關於IPC機制,目前知道就好,本文不詳細討論IPC機制,後續有專門寫篇文章講述Android系統的IPC機制。網絡

線程跟進程不同,進程是不能共享內存,而線程能夠。線程是包含於進程的。線程用的內存都是從其對應的進程那分配過來的。線程因爲其容易建立,內存共享,適用併發場景等特性,常被稱爲輕量級進程。由於線程間能夠共享數據,因此在併發編程中開經常會出現一個不當心從而致使併發問題,也就是多線程間數據不一樣步致使的問題。這點在多線程開發中要注意。多線程

設置進程

在Android系統中,默認狀況下,APP開發是單進程的。通常來講,關於多進程的業務需求也比較少,因此單進程徹底夠用。若是須要多進程的話,Android也是提供了方法來實現多進程。方法就是在Android Manifest文件中,爲android 四大組件設置android:process屬性。默認狀況下,都是運行在同一個進程中的,默認進程名是應用包名。併發

舉例說明:app

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".SecondActivity"
            android:process=":second"
            >
        </activity>
        
        <activity android:name=".ThirdActivity"
            android:process="com.example.rainyang.demo.third"
            />
複製代碼

MainActivity 是運行在默認進程,進程名爲應用包名:com.example.rainyang.demo;ide

SecondActivity 運行的進程名爲:com.example.rainyang.demo:second,:是一種簡寫,表示在當前進程名前加上包名;spa

ThirdActivity 運行的進程名爲:com.example.rainyang.demo.third。

上面舉的例子是用四大組件之一的Activity表示的,同理,process屬性在Service、ContentProvider、Broadcast中是同樣的使用方式,同樣的效果。

進程也是有優先級的劃分的,你想啊,手機的內存就那麼大,當運行多個進程(app)的時候,系統內存告急,當前正在使用的進程須要內存,怎麼辦?總不能不給內存,讓用戶無法使用吧。此時系統會根據進程的優先級來選擇殺死優先級最低的進程,回收其內存,而後再把內存分配給,用戶當前正在與其交互的進程。從而保證用戶的正常的使用。

接下來咱們看關於進程的分類。

進程分類

進程分類是依據進程的優先級高低爲標準,進行的分類。下面將從優先級從高到低的順序分別介紹各類進程。

foreground process(前臺進程)

前臺進程是用戶正在與其交互的進程,是當前正在執行的操做所必須的進程。知足下面任何一條件的狀況,其所在的進程都屬於前臺進程。

  • 用戶正在和Activity組件交互,而且Activity的onResume回調正在執行。Activity組件所屬的進程爲foreground process。
  • BroadcastReceiver組件的onReceived()方法正在執行。其所在進程爲foreground process。
  • Service服務的onCreate()方法、onStart()方法、onDestroy()這三個方法中,若是有一個方法正在執行。此刻,其所屬進程爲foreground process。

前臺進程是優先級最高的,通常來講,系統不會kill它,回收它的內存。你想啊,前臺進程是用戶正在使用操做的進程,忽然讓系統回收了,那用戶體驗得多糟糕。對於前臺進程它通常是系統爲其服務的進程,正式由於前臺進程須要內存,系統纔會去kill其餘進程,回收內存,來知足它。

經過上面知足前臺進程的幾種狀況,能夠發現,這些狀況都是和Android四大組件有關係的。再看看以前說到的設置多進程的方式,是在四大組件中經過process屬性來設置。這些都是遙相呼應的。必定程度上能夠理解爲,四大組件就表明和實現了APP進程。

Visible process(可見進程)

可見進程是正在作一些用戶關心的事,它的優先級雖然比前臺進程優先級低,可是從它的描述詞——"用戶關心" 就能夠看出,不能輕易殺死它,否則用戶心理確定不爽。當知足下面任一狀況,表示其所在進程爲可見進程:

  • Activity可見,可是並無在前臺和用戶交互(該Activity的onPause回調被調用),這怎麼理解呢?你想一想這樣一種狀況,Activity上面出現一個彈窗,此刻Activity是可見的,可是當前用戶的關注交互點是彈窗。
  • 經過調用Service的startForeground()方法,開啓一個前臺服務。
  • 正在host一個系統用於用戶注意的特定功能的服務,例如動態壁紙,輸入法服務等。

這種進程,優先級也比較高,通常不輕易殺死。

Service process(服務進程)

當Service組件調用startService()方法來啓用一個服務時,該服務所屬進程爲服務進程。儘管服務進程不會像前臺進程,可見進程那樣直接對用戶可見的,可是在服務進程中常常會用用戶所關心的一些事,好比後臺網絡數據的上傳下載邏輯。因此除非內存不夠用了,通常不會在內存夠用的狀況下去殺死服務進程。

已經運行了很長時間(例如30分鐘或更長時間)的Service可能會降級,以容許其進程降低到下面描述的緩存LRU列表。 這有助於避免出現內存泄漏或其餘問題的長時間運行服務佔用大量RAM而致使系統沒法有效使用緩存進程的狀況。

Cached process(緩存進程)

緩存進程是優先級最低的進程,當其餘地方須要內存的時候,系統會優先考慮殺死該進程。(真可憐。。),殺死該類進程對用戶體驗不會形成影響。

通常來講,系統中會有多個緩存進程,目的是在應用間切換的起到更有效切換的做用(緩存嘛,備胎既視感),並根據系統須要,按期的清理最老的緩存進程。系統在全部的緩存進程都殺死回收內存後,還不知足所須要的內存,就會選擇向服務進程下手。

小結

經過上面對幾種進程類型的理解,開發者就能夠根據需求,把邏輯放在合適的進程中,避免重要業務邏輯放進低優先級的進程中,從而致使服務被殺死,用戶體驗很差,這種狀況。

IPC

IPC(inter-process communication) 進程間通訊,文章開頭有提到過。其機制的做用是爲了知足多進程間通訊的需求。Android系統中,多進程通訊的方式有Binder、AIDL(內部也是Binder)、Socket、ContentProvider等等。關於IPC機制的實現,後面的文章在詳細講解。


創做不易,以爲還不錯的話,就點個""鼓勵下吧!


微捷徑


我的公衆號
相關文章
相關標籤/搜索