huazi

huazi

《Android開發藝術探索》筆記-第1章

1. Activity 生命週期的全面分析#

正常生命週期

  • onCreate: 表示 Activity 正在被創建
  • onReStart: 表示 Activity 正在被重新啟動。一般情況,當前 Activity 動不可見變成可見狀態時,onReStart 就會被調用。當前 Activity 執行 onPause 和 onStop 暫停後,又回到了這個 Activity 後就會調用這個方法。
  • onStart: 表示 Activity 正在被啟動,這是 Activity 已經可見了,但是還沒有出現在前臺,還無法交互。可以理解為 Activity 已經顯示出來,但是還看不到。
  • onResume: 表示 Activity 已經可見了,並且出現在前臺開始活動。onStart 和 onResume 都表示可見,但是 onStart 的時候 Activity 還在後臺,onResume 的時候 Activity 顯示在前臺
  • onPause: 表示 Activity 正在停止。此時可以做一些存儲數據,停止動畫的操作,但是不能太耗時,因為這會影響 Activity 的顯示,oPause 必須先執行完,新的 Activity 的 onResume 才會執行。
  • onStop: 表示 Activity 即將停止,可以做一些重量級的回收操作,同樣不能太耗時
  • onDestory: 表示 Activity 即將被銷毀,這是 Activity 生命週期的最後一個回調,可以做一下回收工作和資源釋放

當前 Activity 打開新的 Activity 採用了透明主題,那麼當前 Activity 不會回調 onStop。

onStart 和 onStop 是從是都可見角度來回調的,onResume 和 onPause 是從是否在前臺的角度來回調的,初次之外,實際使用中沒有太大的區別。

在新的 Activity 啟動前,棧頂的 Activity 需要先 onPause 後,新的 Activity 才能啟動。

onPause 和 onStop 都不能做耗時操作,尤其是 onPause,因此儘量在 onStop 中做操作。

正常情況,當系統配置發生變化後,Activity 會被銷毀。Activity 在異常情況下終止時,系統會調用 onSaveInstanceState 來保存當前 Activity 的狀態,回調時機是在 onStop 之前,當 Activity 被重建後,系統會調用 onRestoreInstanceState, 時序上來說在 onStart 之後。

每個 View 都有 onSaveInstanceState 和 onRestoreInstanceState 方法,看它的實現就能知道他能為 view 恢復哪些數據。

系統只會在異常終止的時候調用 onSaveInstanceState 和 onRestoreInstanceState 存儲和恢復數據,其他情況不會。

2. Activity 的啟動模式#

  • standard: 標準模式,每啟動一個 Activity 就新建一個實例,然後入棧,默認進入啟動它的 Activity 所屬的任務棧
  • singleTop: 棧頂複用模式,如果新的 Activity 已經在棧頂,那麼 Activity 不會被重新創建,同時調用 onNewIntent 方法
  • singleTask: 棧內複用模式,只要 Activity 在一個棧中存在,那麼多次啟動此 Activity 就不會重新創建實例,調用 onNewIntent 方法。如果不存在,系統會現尋找所需的任務棧,如果任務棧不存在會創建任務棧人後入棧,如果任務棧存在,會先看棧內是否有實例,有就調到棧頂,沒有就創建實例入棧。
  • singleInstance: 單實例模式,跟 singleTask 類似,還加了一點就是,此種模式的 Activity 只能單獨的位於一個任務棧中。由於棧內複用的特性,後續不會再創建新的 Activity。

可以通過 TaskAffinity 配置任務棧名字,默認情況任務棧名字為包名。

任務棧 A 為前臺任務棧,任務棧 B 為後臺,此時按返回鍵,任務棧 A 先出棧,然後任務棧 B 出棧,最後回到桌面。

問題:分享到第三方應用,使用什麼啟動方式?

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS flag 表示此 Activity 不會出現在歷史的 Activity 列表中,等同於 android="true"

3. IntentFilter 的匹配規則#

啟動 Activity 分為顯式調用和隱式調用,顯式調用需要明確指定被啟動對象的信息,包括類名和包名。隱式調用則不需要。

IntentFliter 過濾信息有 action, category, data

  • action: Intent 中的 action 必須和過濾規則的中的 action 匹配,字符串完全一致,區分大小寫。
  • category: startActivity 時系統會默認加上一個 android.intent.category.DEAFAULT,所以 intent 中可以不存在 category,但如果存在就必須匹配其中一個
  • data: 過濾規則中定義了 datam,那麼 Intent 中必須也要定義可匹配的 data; data 由兩部分組成,mimeType 和 URI,如果沒有指定 URI,URI 但默認值為 content 和 file(schema)
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。