Android中的任務,進程,線程以及服務

來源:互聯網
上載者:User

1  一個 任務 :從使用者的觀點,他是一個應用程式;對開發人員來講,它是貫穿活動著的任務的一個或者多個視圖,或者一個活動棧。

2 一個 進程 :一個進程是一個運行著應用程式代碼的底層核心過程。通常.apk包裡所有代碼運行在一個進程裡,一個進程對於一個.apk包。

3 一個線程:每個進程包含一個或多個線程。多數情況下,Android 避免在進程裡建立多餘的線程,除非它建立它自己的線程,我們應保持應用程式的單線程性。

進程的重要性,優先順序

1前台進程

使用者當前正在做的事情需要這個進程。如果滿足下面的條件,一個進程就被認為是前台進程:

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

這個進程擁有一個綁定到正在與使用者互動的activity上的Service。

這個進程擁有一個前台啟動並執行Service — service調用了方法 startForeground().

這個進程擁有一個正在執行其任何一個生命週期回調方法(onCreate(),onStart(), 或onDestroy())的Service。

這個進程擁有正在執行其onReceive()方法的BroadcastReceiver。


通常,在任何時間點,只有很少的前台進程存在。它們只有在達到無法調合的矛盾時才會被殺--如果記憶體太小而不能繼續運行時。通常,到了這時,裝置就達到了一個記憶體分頁調度狀態,所以需要殺一些前台進程來保證使用者介面的反應。


2可見進程

一個進程不擁有運行於前台的組件,但是依然能影響使用者所見。滿足下列條件時,進程即為可見:

這個進程擁有一個不在前台但仍可見的Activity(它的onPause()方法被調用)。當一個前台activity啟動一個對話方塊時,就出了這種情況。


3服務進程

一個可見進程被認為是極其重要的。並且,除非只有殺掉它才可以保證所有前台進程的運行,否則是不能動它的。

這個進程擁有一個綁定到可見activity的Service。

一個進程不在上述兩種之內,但它運行著一個被startService()所啟動的service。

儘管一個服務進程不直接影響使用者所見,但是它們通常做一些使用者關心的事情(比如播放音樂或下載資料),所以系統不到前台進程和可見進程活不下去時不會殺它。

4後台進程

一個進程擁有一個當前不可見的activity(activity的onStop()方法被調用)。

這樣的進程們不會直接影響到使用者體驗,所以系統可以在任意時刻殺了它們從而為前台、可見、以及服務進程們提供儲存空間。通常有很多後台進程在運行。它們被儲存在一個LRU(最近最少使用)列表中來確保擁有最近剛被看到的activity的進程最後被殺。如果一個activity正確的實現了它的生命週期方法,並儲存了它的目前狀態,那麼殺死它的進程將不會對使用者的可視化體驗造成影響。因為當使用者返回到這個activity時,這個activity會恢複它所有的可見狀態。


5空進程

一個進程不擁有入何active組件。

保留這類進程的唯一理由是快取,這樣可以提高下一次一個組件要運行它時的啟動速度。系統經常為了平衡在進程快取和底層的核心快取之間的整體系統資源而殺死它們。


很多資料上都是這5大優先順序,

可是我最近在查看文檔的時候發現ActivityManager.RunningAppProcessInfo下的importance有6個值,分別是
IMPORTANCE_BACKGROUND
IMPORTANCE_EMPTY
IMPORTANCE_FOREGROUND
IMPORTANCE_PERCEPTIBLE
IMPORTANCE_SERVICE
IMPORTANCE_VISIBLE

多了一個(IMPORTANCE_PERCEPTIBLE),不是很明白,有明白的童鞋寫下評論哈,我在問答社區德問也提問了,如果有回答的,可以去看看~~


最近在研究下面三個類


ActivityManager.RunningTaskInfo官方文檔這樣解釋:Information you can retrieve about a particular task that is currently "running" in the system. Note that a running task does not mean the given task actually has a process it is actively running
in; it simply means that the user has gone to it and never closed it, but currently the system may have killed its process and is only holding on to its last state in order to restart it when the user returns.
也就是說,ActivityManager.RunningTaskInfo擷取的是正“運行在”系統中的任務,需要注意的是,這裡的“正在啟動並執行任務”並不意味著給定的任務確實有一個活動的進程正在運行,而是用於曾經開啟過,並且一直沒有關閉的任務。但是,最近系統可能會殺死某些進程,直到使用者回來,任務會一直保持最後一次開啟時的狀態。ActivityManager.RunningAppProcessInfoInformation you can retrieve about a running process.你可以擷取的關於運行中的進程的資訊。
ActivityManager.RunningServiceInfoInformation you can retrieve about a particular Service that is currently running in the system.你可以擷取關於特定的正在系統中執行的服務的資訊。

參考資料:

官方文檔

http://www.cnblogs.com/yangxiao24/archive/2011/07/03/2096662.html

http://chaoqunz.blog.163.com/blog/static/6154877720090495819383/

聯繫我們

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