編輯:關於Android編程
本章節所有內容皆為原創,如需轉載,請注明出處。
http://blog.csdn.net/manoel/article/details/38471825
Android是一個多用戶,多任務的系統。
允許多個app在同一時刻執行,在多個程序之間切換並不會有明顯的延遲。
多任務是由Linux內核負責處理的,而程序的運行基於Linux進程。
Linux為每一個用戶分配一個唯一的用戶ID(User ID),用於區分不同的User。
因為權限的原因,每一個用戶只能訪問私有資源,沒有用戶(除了Root用戶,即超級管理員。我們這裡不考慮這個用戶。)可以訪問其他用戶的私有資源。因而,“沙盒”就用來獨立這些用戶。
在Android中,每一個應用都有一個唯一的用戶ID,也就是說,Android中的App對應著Linux中的用戶,並且App之間不能互訪資源。
Android為每一個進程都添加了一個Dalvik虛擬機,也就是每一個app都對應一個Dalvik虛擬機。
下圖展示了Linux進程,Dalvik虛擬機和App之間的關系。
默認地,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的入口。還記得嗎,組件包括:Activity,BroadcastReceiver,Service和ContentProvider。
當第一個組件被激活的時候,這個App的Linux進程就被激活了,除非這個Linux進程已經處於運行狀態。
App開啟的過程總結如下:
建立一個新的Linux進程和Dalvik虛擬機並不是一個瞬時的操作。這個過程會降低性能,並且對用戶體驗稍有影響。
因此,Linux系統通過在啟動(系統啟動)的時候開啟一個特別的Zygote進程去縮短App的啟動時間。
這是怎麼回事呢。Zygote包括了所有預加載的核心庫,新的App進程就是從這個Zygote進程孵化出來的,但是App進程並不會復制那些預加載的核心庫,而是共用Zygote的核心庫。
就是這樣,縮短了App的啟動時間。
在App啟動的時候,Linux進程被創建,當系統需要回收資源的時候Linux進程終結。為了保證用戶每次進入App時不會重復上面的流程。如果不是真的到了資源缺的地步,Dalvik是不會銷毀這個App的所有資源的。因此,盡管一個App的所有組件都被銷毀了,這個App也不會自動終結。
當系統處於資源緊缺的時候,Dalvik負責決定哪一個進程要被Kill掉。那到底是基於什麼去決定是哪一個進程呢?
基於App的可見性和它的組件運行情況,系統對進程進行分級處理。也就是說,低級別進程在高級別進程之前被Kill掉。
下面是進程的各個級別:
承接第二十八話加載大圖片,本篇介紹如何創建一個圖片的副本。安卓中加載的原圖是無法對其修改的,因為默認權限是只讀的。但是通過創建副本,就可以對其做一些修改,繪制等了。首先創
概述作為一個android開發者,在開發應用時,隨著業務規模發展到一定程度,不斷地加入新功能、添加新的類庫,代碼在急劇的膨脹,相應的apk包的大小也急劇增加,
1.服務Service簡介服務(service)是Android中實現程序後台運行的程序,非常適合去執行那些不需要和用戶交互還要長期運行的任務,其運行不依賴任何用戶界面。
前言:為什麼要了解系統Activity,Service,BroadCastReceiver,ContentProvider的啟動流程,這是一個對於即將理解插件中的四大組件