1、Android的系統架構
Android架構分爲5類,分別是應用層、框架層、系統運行庫、硬件抽象層、Linux層
- 應用層:非系統級別的應用程序
- 框架層:給開發人員提供可以開發應用程序的API (如ActivityManager、PackageManager)
- 系統運行庫:兩部分組成,其一是C、C++運行庫(Android中系統組件所調用),Android運行庫(核心庫和ART),其中ART是5.0系統以後,與Dalivak相比,應用程序在第一次安裝的時候,就將字節碼預編譯爲機器碼,大大提高了運行效率
- 硬件抽象層:目的在於硬件抽象化,保護硬件廠商的知識產權
- Linux層:Android的核心服務在Linux內核,例如Binder IPC,USB等等,在這個基礎上還添加了部分Android專用的驅動。
2、講到上面的Binder IPC時候,那麼就看看Binder IPC是個啥玩意兒。。
對,很對。這玩意就是Android中的進程之間通信的核心點,Android的源碼也大部分都使用了Ibinder機制。
我們知道Android的核心服務是在Linux內核,而Linux裏面爲了達到進程間的通信,可以採用管道、Socket等技術手段,爲什麼Android選用Binder這種新型的IPC技術,放棄了原有成熟的技術呢?
主要有兩個方面:
1、性能更加高效。傳統的技術手段在數據拷貝的時候,要麼拷貝兩次,要麼實現的難度又比較大
2、安全性更好,Socket手動輸入IP,很容易被僞造,而Binder從協議本身就做身份驗證
由上面的圖,我們看出來,Client和Server之間的內核空間是可以共享的,所以Binder IPC機制就是利用這種方式來完成底層通信。
Android啓動過程中,Android會初始化系統的各種Serviece,並將這些Service向ServiceManager註冊。client想要獲得具體的service,就可以直接向ServiceManager要就可以了。ServiceManager通過客戶端過來的這個引用在向具體的服務端發送請求,服務端執行完成後返回
3、Activity生命週期的解析
onCreate()
- Activity正在創建,初始化工作,傳參數Bundle爲該Activity上次被異常情況銷燬時保存的信息
onStart()
- Activity正在啓動,可見,沒有焦點
onResume()
- Activity獲取到焦點,可見並開始活動
onPause()
- Activity正在停止,這裏可以做一些數據保存、停止動畫的工作
- 注意:Activity切換時,舊Activity的onPause先執行,然後纔會啓動新的Activity
onStop()
- Activity即將停止,可以做一些回收工作,如取消網絡連接,註銷廣播等
- 注意:新Activity是透明的,就Activity不會走onStop。這是因爲它依然與windowManager保持連接,系統繼續維持它的內部狀態。所以仍然可見,但是失去焦點不可交互
onDestroy()
- Activity即將銷燬,做一些回收工作,資源釋放
onReStart()
- Activity重新啓動,由後臺切換到前臺,由不可見到可見
4、Activity生命週期的切換過程
啓動一個Activity
- onCreate()–>onStart()–>onResume()
打開一個新的Activity
- 舊Activity的onPause()–新Activity的onCreate()–>onStart()–>onResume()–>舊Activity的onStop()
返回到舊的Activity
- 新Activity的onPause()–>舊Activity的onRestart()–>onStart()–>onResume()–>新Activity的onStop()–>onDestory()
Activity1彈出對話框Activity2
- Activity1的onPause()–>Activity2的onCreate()–>onStart()–>onResume()
關閉屏幕按Home鍵
- Activity2的onPause()–>onStop()–>Activity1的onStop()
點亮屏幕/回到前臺
- Activity2的onRestart()–>onStart()–>Activity1的onRestart()–>onStart()–>Activity2的onResume()
關閉對話框Activity2
- Activity2的onPause()–>Activity1的onResume()—>Activity2的onStop()–>onDestory()
銷燬Activity1
- onPause()–>onStop()–>onDestroy()
5、Activity生命週期分析
上面的圖片已經說的非常明顯了,就不在敘述了。
下面來看看onSaveInstanceState和onRestoreInstanceState的區別
首先,當異常情況出現的時候,Activity會重建,非用戶主動去銷燬。異常終止的時候,調用onSaveInstanceState來保存狀態。這個方法調用在onStop之前,但是和onPause沒有時序關係。
注意:onSaveInstanceState與onPause的區別:前者適用於對臨時性狀態的保存,後者適用對數據的持久化保存
當Activity被重新創建的時候,調用onRestoreInstanceState(該方法在onStart之後),並將onSaveInstance保存的bundle對象作爲參數傳到onRestoreInstanceState與onCreate方法。
注意:可通過onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)來判斷Activity是否被重建,並取出數據進行恢復。但需要注意的是,在onCreate取出數據時一定要先判斷savedInstanceState是否爲空。另外,谷歌更推薦使用onRestoreInstanceState進行數據恢復。
6、Activity異常情況下的生命週期分析
Activity被殺死或者重建的原因分析
1、系統資源不足,導致優先級低的Activity被回收
這種情況不是很好模擬,大概把優先級的情況模擬一下。
- 前臺Activity—正在和用戶交互的Activity,優先級是最高的
- 可見但是非前臺Activity–比如Activity中彈出了一個談話框,導致Activity可見。但是位於後臺無法交互
- 服務進程,除了符合前面的兩種情況的Service,其他的Service都被歸納爲服務進程
- 後臺Activity–已經被暫停的Activity,比如執行了onStop,優先級回收最長時間沒有使用過的進程
- 空進程不持有任何組件的情況,保持這種狀態的目的是爲了緩存,便於下一次啓動能夠得到更快的響應
注意:
1、如果一個進程爲另外一個進程提供服務,那麼這個進程的優先級就不會低於享受服務的進程
2、系統內存不足的時候,就會按照上面的順序去殺死進程,並且後續會通過onSaveInstaceState()和onRestoreInstance來存儲和恢復數據。
3、由於服務進程比後臺進程要高一點,所以我們可以把後臺的工作放在Service中去,保證一定的優先級
2、資源相關配置發生改變
默認情況下,如果我們隊Activity不做特殊的處理,那麼當系統配置發生改變的時候,Activity就會被銷燬,並重新創建。
當系統配置發生改變的時候,Activity會被銷燬。其中onPause、onStop、onDestory均會被調用。同時終止的時候,會調用onSaveInstanceState來保存Activity的狀態。
例如:屏幕發生旋轉的時候,會先調用onSaveInstanceState來保存切換時的數據,接着銷燬Activity。然後重新創建一個Activity。在調用onRestoreInstanceState恢復數據
爲了避免由於配置文件導致Activity重建,可在AndroidManifest.xml中對應的Activity設置
android:configChanges=”orientation|keyboardHidden|screenSize”。
此時在旋轉的時候,Activity不會被殺死。只會調用onConfigChanged.此時重寫onConfigChanged方法即可
7、如何讓一個Activity變成一個窗口
在AndroidManifest.xml中設置Activity的主題
<!-- 使得Activity對話框的形式彈出來 -->
android :theme="@android:style/Theme.Dialog"
<!-- 變成半透明 -->
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
8、Activity四種啓動模式
1、設置Activity啓動模式的方法
//1、在AndroidManifest.xml中對應的Activity設定屬性laucnMode
android:launchMode="standard|singleInstance|single Task|single Top"。
//2、通過標記爲設定(addFlags)
intent.addFlags(Intent.XXX)
2、Activity的四種LaunchMode
- standard:標準模式、默認模式
(每次啓動都會創建一個新的實例) - singleTop:棧頂複用模式
(如果新的Activity已經位於棧頂就不會重新創建,並回調onNewIntent(intent)方法) - singTask:棧內複用模式
(只要該Activity在一個任務棧存在,都不會重新創建,並回調onNewIntent(Intent)方法。如果不存在,系統會先尋找是否存在需要的棧,不存在就先創建這個棧,然後把Activity放進去。如果存在,就會創建到已經存在的棧中) - singleInstance:單實例模式
此模式的Activity只能單獨位於一個任務棧中,且任務棧中只有唯一一個實例
標識Activity任務棧名稱的屬性:android:taskAffinity,默認爲應用包名
3、IntentFilter匹配規則
原則:一個intent只有同時匹配某個Activity的intent-filter中的action、category、data算完全匹配;才能啓動Activity
一個Activity可以有多個intent-filiter,一個intent只有成功匹配任意一組intent-filiter,就可以啓動該Activity.