從 ComponentActivity 看 Android Activity 的演變與 Jetpack 架構融合

在 Jetpack Compose 出現后,開發者可能會注意到一個變化:項目的主 Activity 默認從過去熟悉的 AppCompatActivity 變成了 ComponentActivity。這個變化并非偶然,而是 Android 架構在向現代組件化演進過程中一個關鍵的轉折點。本文將圍繞 ComponentActivity,深入講解它的來歷、意義以及它在 Jetpack 架構中的作用。


一、Activity 的演變簡史

Android 應用的生命周期核心組件是 Activity。隨著 Android 框架的發展,Activity 的實現也經歷了多個階段的演進:

  1. 最初版本:Activity

    • 提供基本的生命周期管理、UI 渲染能力。
    • 但沒有支持架構組件(如 ViewModel、LiveData、Lifecycle)的能力。
  2. 引入 Fragment 的 FragmentActivity

    • 為支持 Fragment 的使用,Google 引入了 android.support.v4.app.FragmentActivity
    • 后來演變為 AndroidX 中的 androidx.fragment.app.FragmentActivity
  3. 加入兼容特性的 AppCompatActivity

    • 為支持向下兼容的主題、控件、ActionBar 等特性,AppCompatActivity 出現。
    • 是多數 XML 時代 UI 項目的默認基類。
  4. 四個類的簡介及繼承關系

    • Activity
      Android 框架最原始的 Activity,提供最基本的組件生命周期管理,是所有 Activity 的基類。傳統上開發者直接繼承它來開發應用,但它的功能比較基礎,沒有內置對現代架構組件(如 Lifecycle、ViewModel 等)的支持。

    • ComponentActivity
      引入較晚,作為一種擴展版的 Activity。它繼承自 Activity,并內置了對 Android Architecture Components 的支持(例如 LifecycleOwner、SavedStateRegistryOwner 等)。ComponentActivity 專注于解耦業務邏輯和 UI 之間的關系,能更好地支持新一代的應用架構,也為 Compose 提供了簡潔的入口。

    • FragmentActivity
      繼承自 Activity 的一個擴展類,主要目的是為 Activity 提供對 Fragment 的支持。FragmentActivity 隨著 Android 支持庫的出現而推出,目的是讓舊版本的 Android 也能使用 Fragment 相關功能。

    • AppCompatActivity
      是 FragmentActivity 的子類,屬于 AndroidX AppCompat 庫。它為應用提供了最新的 Material Design 組件和向下兼容的特性,例如支持 ActionBar、菜單主題和其他 UI 組件。很多舊項目基于 AppCompatActivity 來保持對老系統的兼容性,同時獲得新 UI 組件支持。


二、為什么中途引入 ComponentActivity?

Jetpack 架構組件(如 ViewModel、Lifecycle、SavedState 等)最早在 2017 年推出,最初使用一些工具類(如 ViewModelProviders)在 Activity 中進行適配。但隨著 Jetpack 架構體系逐漸成熟,Google 逐漸意識到:

需要一個統一、輕量、無 UI 依賴的 Activity 基類,來天然支持 Jetpack 架構組件。

ComponentActivity 來自于 AndroidX Activity 庫,首次引入是在:

androidx.activity:activity:1.0.0
📅 發布于 2019年6月(在 Google I/O 2019 前后)

  • 官方文檔鏈接:https://developer.android.com/jetpack/androidx/releases/activity
  • 它是 Jetpack 架構組件整合的一部分,起初目的是為支持 ViewModel、Lifecycle 等架構的注入。

早期的結構大致是這樣的:

AppCompatActivity? FragmentActivity? Activity

而引入 ComponentActivity 后,變成了:

AppCompatActivity? FragmentActivity? ComponentActivity  ← 新插入? Activity

ComponentActivity 實現了多個接口,使得其具備以下能力:

  • 是一個 LifecycleOwner
  • 是一個 ViewModelStoreOwner
  • 是一個 SavedStateRegistryOwner
  • 是一個 OnBackPressedDispatcherOwner

這使得 Activity 不再需要借助輔助類,就可以天然使用 ViewModel、SavedState 等功能。


三、為什么 Compose 默認使用 ComponentActivity?

Compose 推出的目標是簡化 UI 構建流程,同時完全脫離傳統的 XML、Fragment 體系。

3.1 輕量化與現代架構支持

  • Compose 的輕量化思想
    Compose 是一種聲明式 UI 框架,它本身能夠大幅簡化 UI 的構建過程,不再需要通過 XML 和繁瑣的視圖樹管理。如果項目全部采用 Compose 開發,許多傳統由 Fragment 提供的“UI 組件化”方案就不再必需。

  • ComponentActivity 的優勢
    ComponentActivity 內置了對 Lifecycle、SavedStateRegistry 等現代架構組件的支持,這與 Compose 的聲明式和狀態驅動模式更契合。相比之下,AppCompatActivity 通常承載了歷史遺留的兼容層,如果應用全用 Compose,這層兼容性反而成了額外的負擔。

3.2 模板和標準化演進

  • 官方模板的變更
    以前的項目模板往往基于 AppCompatActivity,是因為當時大部分項目都需要兼容 Fragment 以及一些傳統 UI 需求。隨著 Compose 的推廣,Google 推出了更精簡的模板,默認選擇 ComponentActivity,從而鼓勵使用新架構和純 Compose 代碼。

  • 降低復雜度
    對于純 Compose 應用,ComponentActivity 已經足夠支撐諸如導航、狀態保存等需求,不需要額外依賴 AppCompat 的兼容層,簡化了依賴結構,也能減少應用體積。

  • 一個 足夠輕量 的 Activity,避免 UI 控件和兼容庫的冗余依賴。

  • 一個 完美兼容 Jetpack 架構組件 的容器。

于是,Compose 的推薦寫法變成了:

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyComposeApp()}}
}

這正是 Compose 使用 ComponentActivity 的原因:

它足夠干凈、足夠現代,同時提供了 Compose 和 Jetpack 架構無縫連接的能力。


四、ComponentActivity 如何促進 ViewModel 使用方式演進?

既然 ViewModel 和 LiveData 更早就有,那為什么 ComponentActivity 要到 2019 年才引入來支持它們?

下面我詳細解釋一下時間線和背景👇


🕰? ViewModel 和 LiveData 的引入時間

  • LiveData

    • 首次引入版本:android.arch.lifecycle:runtime:1.0.0
    • 發布時間:2017年11月(Google I/O 2017 之后)
  • ViewModel

    • 同樣首次出現在 android.arch.lifecycle:viewmodel:1.0.0
    • 發布時間也是:2017年11月

📦 它們當時是屬于 android.arch.* 包名下,也就是 Jetpack 的 早期版本(現在都遷移到了 androidx.* 包中)。


🤔 那為什么 ComponentActivity 要到 2019 年才出現?

原因是這樣的:

? 1. 最初是通過 ViewModelHelpers 適配的

在 ViewModel 剛發布的時候,為了讓開發者在不同類型的 Activity/Fragment 中用 ViewModel,Google 提供了“Helper 類”來協助獲取:

ViewModelProviders.of(activity).get(MyViewModel::class.java)

這其實是通過“工具方法”來適配 FragmentActivityAppCompatActivity,不是通過統一的基類來支持架構組件。


? 2. 后來 Google 想系統性地整合架構組件支持

為了徹底解耦各種 Activity 的生命周期管理、狀態保存、ViewModel 等支持,Google 決定:

抽出一個專門的基類 ComponentActivity,來做為現代架構組件支持的通用基礎。

這個類整合了:

  • LifecycleOwner
  • ViewModelStoreOwner
  • SavedStateRegistryOwner
  • OnBackPressedDispatcherOwner(也支持 Compose 的 back handling)

它讓所有 Activity 都可以天然具備使用架構組件的能力,不再依賴工具類或中間層。

  • 你現在在 Compose 項目中可以直接這樣寫:
class MainActivity : ComponentActivity() {val viewModel by viewModels<MyViewModel>()...
}

這是 ComponentActivity 實現了 ViewModelStoreOwner 才能這么用,舊的 Activity 是不行的。

不但代碼更簡潔,而且可以更方便地與 SavedStateHandleActivityResultLifecycleObserver 等 Jetpack 能力結合。

從此,ViewModel 與 Activity 的結合方式更加清晰、現代、類型安全。


五、小結

ActivityFragmentActivityAppCompatActivity 的歷史路徑中,我們可以看出 Android 為適應不斷變化的 UI 架構做出的調整。而 ComponentActivity 的加入,是 Jetpack 架構化進程中的一次重要升級:

  • 它為 ViewModel、Lifecycle、SavedState 提供了統一支持
  • 它是 Compose 的天然基座
  • 它讓現代開發變得更簡單、更一致

可以說,沒有 ComponentActivity,就沒有 Compose 時代 Jetpack 架構的統一閉環。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77319.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 防火墻( iptables )

目錄 一、 Linux 防火墻基礎 1. 防火墻基礎概念 &#xff08;1&#xff09;防火墻的概述與作用 &#xff08;2&#xff09;防火墻的結構與匹配流程 &#xff08;3&#xff09;防火墻的類別與各個防火墻的區別 2. iptables 的表、鏈結構 &#xff08;1&#xff09;規則表 …

大數據 - 2. Hadoop - HDFS(分布式文件系統)

前言 為什么海量數據需要分布式存儲技術&#xff1f; 文件過大時&#xff0c;單臺服務器無法承擔&#xff0c;要靠數量來解決。數量的提升帶來的是網絡傳輸、磁盤讀寫、CPU、內存等各方面的提升。 眾多的服務器一起工作&#xff0c;如何保證高效且不出錯 &#xff1f; 大數…

使用cursor進行原型圖設計

1.下載cursor 2.模式設置&#xff1a; 模型使用claude-3.7-sonnet的think模式 3.引導詞模板&#xff1a; 我想要開發一個中高考英語口語考試的模擬考試系統&#xff0c;我需要將上面的這個應用輸出成高保真的原型圖設計。請考慮以下的規范&#xff1a; 用戶體驗&#xff1…

極狐GitLab 功能標志詳解

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 功能標志 (BASIC ALL) 使用功能標志&#xff0c;您可以將應用程序的新功能小批量部署到生產環境中。您可以為部分用戶打開和…

AI與無人駕駛汽車:如何通過機器學習提升自動駕駛系統的安全性?

引言 想象一下&#xff0c;在高速公路上&#xff0c;一輛無人駕駛汽車正平穩行駛。突然&#xff0c;前方的車輛緊急剎車&#xff0c;而旁邊車道有一輛摩托車正快速接近。在這千鈞一發的瞬間&#xff0c;自動駕駛系統迅速分析路況&#xff0c;判斷最安全的避險方案&#xff0c;精…

【NLP 63、大模型應用 —— Agent】

人與人最大的差距就是勇氣和執行力&#xff0c;也是唯一的差距 —— 25.4.16 一、Agent 相關工作 二、Agent 特點 核心特征&#xff1a; 1.專有場景&#xff08;針對某個垂直領域&#xff09; 2.保留記憶&#xff08;以一個特定順序做一些特定任務&#xff0c;記憶當前任務的前…

RAGFlow本地部署教程 :多模態檢索+動態生成,用AI重構企業知識生產力

RAGFlow是一款基于檢索增強生成&#xff08;RAG&#xff09;技術的智能工作流平臺&#xff0c;通過整合多源數據檢索與生成式AI模型&#xff0c;優化企業知識管理、智能問答及自動化報告生成&#xff0c;核心功能包括&#xff1a; 多源數據融合&#xff1a;支持數據庫、文檔庫、…

【C/C++】深入理解指針(二)

文章目錄 深入理解指針(二)1.const修飾指針1.1 const修飾變量1.2 const修飾指針變量 2.野指針2.1 野指針成因1.指針未初始化2. 指針越界訪問3.指針指向的空間釋放 2.2 如何規避野指針2.2.1 指針初始化2.2.2 小心指針越界2.2.3 指針變量不再使?時&#xff0c;及時置NULL&#x…

【verilog】在同一個 always 塊中寫了多個“看起來獨立”的 if / if-else,到底誰先誰后,怎么執行?會不會沖突?

&#x1f50d; 問題本質 在一個 always (posedge clk) 塊中&#xff0c;所有的代碼都是順序執行的。但這不意味著它就像軟件一樣“一條一條執行”&#xff0c;因為最終是電路&#xff01;電路是并行存在的&#xff01; Verilog 是硬件描述語言&#xff08;HDL&#xff09;&am…

【React】什么是 Hook

useStateuseEffectuseRef 什么是hook&#xff1f;16.8版本出現的新特性。可以在不編寫class組件的情況下使用state以及其它的React特性 為什么有hook&#xff1f;class組件很難提取公共的重用的代碼&#xff0c;然后反復使用&#xff1b;不編寫類組件也可以使用類組件的狀態st…

如何查看自己抖音的IP屬地?詳細教程及如何修改

在當今互聯網時代&#xff0c;IP屬地信息已成為各大社交平臺&#xff08;如抖音、微博、快手等&#xff09;展示用戶真實網絡位置的重要功能。以下是關于如何查看抖音IP屬地的詳細教程及常見問題解答&#xff0c;幫助您快速了解相關信息&#xff1a; 一、如何查看抖音賬號的IP屬…

深度學習算力革新:AI服務器在運維工作中的智能化實踐

【導語】作為IT基礎設施服務領域的從業者&#xff0c;我們在日常工作中發現&#xff0c;AI服務器的智能化運維能力正在重塑傳統IDC的管理模式。本文將以DeepSeek系列服務器為例&#xff0c;分享智能算力設備在真實運維場景中的創新應用。 一、傳統服務器集群的運維痛點 在數據…

安裝部署RabbitMQ

一、RabbitMQ安裝部署 1、下載epel源 2、安裝RabbitMQ 3、啟動RabbitMQ web管理界面 啟用插件 rabbitmq數據目錄 創建rabbitmq用戶 設置為管理員角色 給用戶賦予權限 4、訪問rabbitmq

中間件--ClickHouse-4--向量化執行(什么是向量?為什么向量化執行的更快?)

1、向量&#xff08;Vector&#xff09;的概念 &#xff08;1&#xff09;、向量的定義 向量&#xff1a;在計算機科學中&#xff0c;向量是一組同類型數據的有序集合&#xff0c;例如一個包含多個數值的數組。在數據庫中&#xff0c;向量通常指批量數據&#xff08;如一列數…

Python PDF 轉 Markdown 工具庫對比與推薦

根據最新評測及開源社區實踐&#xff0c;以下為綜合性能與適用場景的推薦方案&#xff1a; 1. ?Marker? ?特點?&#xff1a; 轉換速度快&#xff0c;支持表格、公式&#xff08;轉為 LaTeX&#xff09;、圖片提取&#xff0c;適配復雜排版文檔?。依賴 PyTorch&#xff0c…

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 組件生命周期 父子組件生命周期順序&#xff1a; 創建時&#xff1a; 父 beforeCreate → 父 created → 父 beforeMount → 子組件生命周期 → 父 mounted 更新時&#xff1a; 父 beforeUpdate → 子組件更新 → 父 updated。 銷毀時&#xff1a; 父 beforeDestroy…

Microsoft Azure 基礎知識簡介

Microsoft Azure 基礎知識簡介 已完成100 XP 2 分鐘 Microsoft Azure 是一個云計算平臺&#xff0c;提供一系列不斷擴展的服務&#xff0c;可幫助你構建解決方案來滿足業務目標。 Azure 服務支持從簡單到復雜的一切內容。 Azure 具有簡單的 Web 服務&#xff0c;用于在云中托…

C語言鏈接數據庫

目錄 使用 yum 配置 mysqld 環境 查看 mysqld 服務的版本 創建 mysql 句柄 鏈接數據庫 使用數據庫 增加數據 修改數據 查詢數據 獲取查詢結果的行數 獲取查詢結果的列數 獲取查詢結果的列名 獲取查詢結果所有數據 斷開鏈接 C語言訪問mysql數據庫整體源碼 通過…

【Maven】手動安裝依賴到本地倉庫

【Maven】手動安裝依賴到本地倉庫 【一】下載依賴【二】安裝 JAR 文件到本地倉庫【三】驗證安裝【四】在項目中使用該依賴【1】注意事項【2】額外提示 【一】下載依賴 登錄到中央倉庫下載依賴&#xff0c;中央倉庫地址&#xff1a;https://mvnrepository.com/ 搜搜你的依賴的a…

騰訊云golang一面

go垃圾回收機制 參考自&#xff1a;https://zhuanlan.zhihu.com/p/334999060 go 1.3 標記清除法 缺點 go 1.5 三色標記法 屏障機制 插入屏障 但是如果棧不添加,當全部三色標記掃描之后,棧上有可能依然存在白色對象被引用的情況(如上圖的對象9). 所以要對棧重新進行三色標記掃…