Android要點提煉總結之Activity

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.


發佈了31 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章