Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 並發編程:(一)基礎知識 —— 1.2 程序的啟動和終結

Android 並發編程:(一)基礎知識 —— 1.2 程序的啟動和終結

編輯:關於Android編程

本章節所有內容皆為原創,如需轉載,請注明出處。

http://blog.csdn.net/manoel/article/details/38471825


Android是一個多用戶,多任務的系統。

允許多個app在同一時刻執行,在多個程序之間切換並不會有明顯的延遲。

多任務是由Linux內核負責處理的,而程序的運行基於Linux進程。

Linux進程

Linux為每一個用戶分配一個唯一的用戶ID(User ID),用於區分不同的User。

因為權限的原因,每一個用戶只能訪問私有資源,沒有用戶(除了Root用戶,即超級管理員。我們這裡不考慮這個用戶。)可以訪問其他用戶的私有資源。因而,“沙盒”就用來獨立這些用戶。

在Android中,每一個應用都有一個唯一的用戶ID,也就是說,Android中的App對應著Linux中的用戶,並且App之間不能互訪資源。

Android為每一個進程都添加了一個Dalvik虛擬機,也就是每一個app都對應一個Dalvik虛擬機。

下圖展示了Linux進程,Dalvik虛擬機和App之間的關系。

An image of two apps executing in Linux processes.

默認地,App和進程有一對一的關系。

但如果有需要的話,一個App可以在幾個進程中運行,或者幾個App在同一個進程中運行。

生命周期

App的生命周期被封裝在它自己的Linux進程中,從Java的視角來說,就是android.app.Application類。

當Dalvik調用Application的onCreate()方法時,Applicationg對象就被生成了。理想情況下,Dalvik調用Application的onTerminate()的時候,app就停止了。

但切記,不能依靠這個去判斷一個Application對象被銷毀了!

因為潛在的Linux進程或許已經被Kill掉了,這個時候Dalvik還沒有調用onTerminate()。

總之,Application對象是在一個進程中第一個被實例化的對象,也是最後一個被銷毀的。

App啟動

當一個App的任何一個組件被激活的時候,這個App就被開啟了。

任何組件都是App的入口。還記得嗎,組件包括:Activity,BroadcastReceiver,Service和ContentProvider。

當第一個組件被激活的時候,這個App的Linux進程就被激活了,除非這個Linux進程已經處於運行狀態。

App開啟的過程總結如下:

  1. 開啟Linux進程.
  2. 創建Dalvik虛擬機.
  3. 創建Application實例.
  4. 創建App的入口組件.

    建立一個新的Linux進程和Dalvik虛擬機並不是一個瞬時的操作。這個過程會降低性能,並且對用戶體驗稍有影響。

    因此,Linux系統通過在啟動(系統啟動)的時候開啟一個特別的Zygote進程去縮短App的啟動時間。

    這是怎麼回事呢。Zygote包括了所有預加載的核心庫,新的App進程就是從這個Zygote進程孵化出來的,但是App進程並不會復制那些預加載的核心庫,而是共用Zygote的核心庫。

    就是這樣,縮短了App的啟動時間。

    App終結

    在App啟動的時候,Linux進程被創建,當系統需要回收資源的時候Linux進程終結。為了保證用戶每次進入App時不會重復上面的流程。如果不是真的到了資源缺的地步,Dalvik是不會銷毀這個App的所有資源的。因此,盡管一個App的所有組件都被銷毀了,這個App也不會自動終結。

    當系統處於資源緊缺的時候,Dalvik負責決定哪一個進程要被Kill掉。那到底是基於什麼去決定是哪一個進程呢?

    基於App的可見性和它的組件運行情況,系統對進程進行分級處理。也就是說,低級別進程在高級別進程之前被Kill掉。

    下面是進程的各個級別:

    Foreground
    App在前台有可見的組件,或者有一個Service與其他進程中的某個可見的Activity處於綁定狀態,或者BroadcastReceiver正在運行。
    Visible
    App有一個部分可見的組件。
    Service
    Service處於運行狀態,但是並沒有和一個可見的組件綁定。
    Background
    不可見的Activity。
    Empty
    沒有活躍組件的進程。空進程之所以存在,就是為了改善App的啟動次數,但是它們也會第一個被Kill掉。


    參考資料

    http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved