[Android] 進程(Process)和線程(Thread)

來源:互聯網
上載者:User

標籤:

當應用的某一個組件(四大組件:Activity,Service,BroadcastReceiver,ContentProvider)啟動同時應用沒有其他的組件正在運行,也就是說應用的第一個組件啟動的時候,安卓系統為這個應用開啟一個新的Linux進程,這個進程中包含一個線程。預設情況下,一個應用的所有組件都運行在同一個進程的同一個線程下,這個線程叫主線程。但是不同的組件可以被人為地安排在不同的進程中,同時以可以為一個進程建立額外的線程。

進程

預設情況下,一個應用的所有組件都運行在同一個進程中,而且大部分應用不需要額外的進程。但是如果需要人為地控制不同的組件運行在不同的進程中,可以通過編輯manifest檔案來完成這一點。

manifest檔案中每一類組件<activity><service><receiver>, 和<provider>都支援android:process屬性,這個屬性指明這個組件運行在某一個特定的進程中。通過設定android:process,可以讓每一個組件運行在自己的進程中,或者一些組件共用同一個進程而其他組件共用另一個進程。甚至可以讓不同應用的組件運行在同一個進程中,當然需要這些應用有相同的Linux ID並且簽名相同。

在系統記憶體不足並且其他應用需要記憶體的時候,Android系統可能會終止一些進程。運行在這些進程中的組件也會同時被摧毀。這些組件重新啟動的時候進程也會重新啟動。

Android系統根據進程與使用者之間的關係來決定終止哪一個進程。比如說,一個進程中Activities都不對使用者可見,而另一個進程中的Activity對使用者可見,那麼前一個進程更有可能被終止。

進程生命週期

Android系統會儘可能長時間地保持應用進程,但是系統最終需要終止一下進程以啟動更重要的進程。為了決定終止哪一個進程,系統對每一個進程進行重要程度的評估與分級。最低重要程度的進程會最先被終止,然後是次低重要程度的。

進程按重要程度被分為5個層次:

 

1. 前台進程

與使用者進行中互動的進程,一個進程稱為前台進程需要滿足這些條件:

  進程擁有一個Activity,Activity正在與使用者互動。(Activity的onResume()方法被調用)

  進程擁有一個Service,Service與前台Activity綁定

  進程擁有一個前台Service,Service調用了startForeground()函數

  進程擁有一個Service,Service正在執行生命週期函數

  進程擁有一個BroadcastReceiver,BroadcastReceiver正在執行onReceive()函數。

一般來說,某一時間只有少數幾個前台進程存在。它們只有在非常極端的情況下才會被終止。

 

2.可見進程

可見進程指進程不是前台進程但是仍然能影響到使用者觀察到的內容。可見進程通常指下面這樣的進程。

  進程擁有一個Activity,Activity不是前台Activity但是依然對使用者可見(調用了onPause()但是沒有調用onStop())。通常指前台Activity被一個對話方塊覆蓋的情況

  進程擁有一個Service,Service與可見Activity綁定。

可見進程被認為是很重要的,一般不會被終止,除非一定要這樣做來保證所有前台進程運行。

 

3.服務進程

進程擁有Service,Service調用了startService(),但是不屬於前台進程和可見進程。雖然服務進程與使用者介面沒有直接的關係,但是它們也在做使用者關心的行為,比如播放背景音樂,網路下載等。所以系統不會終止他們,除非系統沒有足夠的記憶體使得服務進程與前台進程,可見進程共存。

 

4.背景進程

進程擁有Activity,但是Activity對使用者不可見(Activity的onStop()方法被調用)。這些進程對使用者體驗沒有直接的影響,系統可以在任何時候終止他們來為前台進程,可見進程和服務進程提供足夠的記憶體。通常系統中有很多背景進程,它們存貯在一個LRU(least recently used) 表中。如果Activity正確地實現了生命週期方法,終止背景進程不會對使用者有任何影響。

 

5.空進程

不擁有任何活動的組件的進程,系統進程會終止這些進程。

 

Android系統對進程的評級總是按照進程能達到的最進階別。比如進程擁有一個service和一個可見Activity,這進程被評估為可見進程,而不是服務進程。

應用進程擁有Service會比擁有背景Activity獲得更高的評級,所以,對於長時間的操作,Service會比Activity中建立的背景工作執行緒有優勢。

 

線程

當應用啟動時,系統為應用建立了一個執行線程,稱為主線程。這個線程主要負責分發事件到合適的使用者介面組件,繪製介面。主線程也是系統操作UI控制項的線程,因此主線程也被稱作UI線程。

系統並不會為每一個組件創造一個新的線程,所有的組件都運行在主線程中。每一個組件的系統調用在主線程中分發。因此響應系統調用的函數(比如onKeyDown()響應使用者點擊量後退按鈕)總是運行在UI線程中。

當app執行高強度耗時間長度的工程時,單一的線程表現會很差。具體地說,如所有的事情都發生在UI線程中,長時間的操作比如網路連接,資料庫查詢將會阻塞整個UI線程。從使用者的角度來看,系統似乎卡住了。更糟糕的是,如果UI線程阻塞了幾秒鐘(目前是大約5秒),使用者會看到“application not responding"視窗。使用者可能會因此推出應用。

另外,Android UI控制項不是安全執行緒的,因此不能在其他線程中操作UI控制項。所有的UI操作必須在UI線程中。因此關於Android線程兩個最簡單的規則是:

1.不要阻塞UI線程

2.不要在UI線程外(指其他線程)操作UI控制項。

 

背景工作執行緒

如果需要執行長時間的行為,這些行為需要在其他的線程中執行,稱作背景線程或背景工作執行緒。

比如,下面是一個例子:在背景工作執行緒中下載圖片並顯示在ImageView中。

public void onClick(View v) {    new Thread(new Runnable() {        public void run() {            Bitmap b = loadImageFromNetwork("http://example.com/image.png");            mImageView.setImageBitmap(b);        }    }).start();}

這個代碼事實上是有問題的,因為它違背了第二條規則:不要在UI線程外(指其他線程)操作UI控制項。代碼中在背景工作執行緒修改了ImageView的狀態,這會導致不確定的行為。

為瞭解決這個問題,Android提供了一些在工作現在中操作UI線程的方法,比如:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)

比如你可以用View.post(Runnable)來修正上面的代碼:

public void onClick(View v) {    new Thread(new Runnable() {        public void run() {            final Bitmap bitmap =                    loadImageFromNetwork("http://example.com/image.png");            mImageView.post(new Runnable() {                public void run() {                    mImageView.setImageBitmap(bitmap);                }            });        }    }).start();}

現在這樣的實現是安全執行緒的了,網路操作在背景工作執行緒中完成,而ImageView在UI線程中改變。

但是,隨著操作複雜度的上升,這樣的代碼會變得負責而且難以維護。為了處理背景工作執行緒中更複雜的行為,使用UI線程中的Handler向UI線程傳遞資訊會是一個不錯的行為,同時,使用AsyncTask或許是最好的解決方案。

[Android] 進程(Process)和線程(Thread)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.