kotlin类 继承android.app.Activity 和androidx.activity.ComponentActivity 有什么区别?

在 Android 开发中,继承 android.app.Activity 和 androidx.activity.ComponentActivity 有着非常巨大的区别。

简单来说:android.app.Activity 是最基础的老古董,而 androidx.activity.ComponentActivity 是现代 Android 开发(Jetpack 架构)的基石。 在现在的开发中,我们几乎永远不会直接继承 android.app.Activity。

以下是它们的核心区别:

1. 对现代架构组件(Jetpack)的支持

这是最大的区别。

  • android.app.Activity:它仅仅是 Android 操作系统提供的一个基础窗口容器。它不知道什么是 ViewModel,也不知道什么是 Lifecycle(生命周期感知)。

  • ComponentActivity:它天生内置了对 Jetpack 架构组件的支持。它实现了 LifecycleOwner、ViewModelStoreOwner 和 SavedStateRegistryOwner。

    • ViewModel 支持:在 ComponentActivity 中,你可以直接使用 viewModels() 委托来轻松获取 ViewModel,并且 ViewModel 可以在屏幕旋转时自动存活。

    • Lifecycle 支持:你可以让其他类直接观察这个 Activity 的生命周期(lifecycle.addObserver(...)),从而解耦代码。

2. 是否支持 Jetpack Compose (现代 UI 框架)

  • android.app.Activity:完全不支持 Jetpack Compose。

  • ComponentActivity它是 Jetpack Compose 的标准底层容器。如果你在用 Compose 写 UI,你必须继承它,因为启动 Compose UI 的 setContent { } 方法就是作为 ComponentActivity 的扩展函数存在的。

3. 处理页面返回结果(Activity Result API)

  • android.app.Activity :如果你要启动另一个页面并获取结果(比如打开相册选图),你需要使用老旧的 startActivityForResult(),然后在臃肿的 onActivityResult() 回调里写各种 if/else 请求码判断。这种老方法官方已经废弃 (Deprecated)

  • ComponentActivity :提供了现代的 Activity Result API。你可以使用 registerForActivityResult,以回调或协程的方式极其优雅地处理权限请求、页面返回结果,代码高内聚且类型安全。

4. 现代的返回键/手势拦截

  • android.app.Activity:要拦截返回键,你需要重写 onBackPressed() 方法。这种写法在现代 Android 的"预测性返回手势"(Predictive Back Gesture)下表现很差。

  • ComponentActivity:内置了 OnBackPressedDispatcher。你可以在 Activity、Fragment 甚至 Compose 的任意位置动态注册和注销返回事件拦截,而不是全部挤在 Activity 的重写方法里。


继承关系图

为了更直观地理解,你可以看看它们的家族继承谱系:

code Text

downloadcontent_copy

expand_less

复制代码
java.lang.Object
   ↳ android.app.Activity  (最基础的系统级 Activity,不要直接用)
        ↳ androidx.core.app.ComponentActivity (底层兼容处理,通常不直接用)
             ↳ androidx.activity.ComponentActivity (🌟纯 Compose 项目的标准父类,Jetpack 的核心)
                  ↳ androidx.appcompat.app.AppCompatActivity (🌟传统的 XML 项目/混合项目标准父类,增加了老版本主题和 UI 控件的兼容)

总结:我该怎么选?

  1. 如果你在写纯 Jetpack Compose 的新项目

    直接继承 ComponentActivity。它是最轻量级且功能完备的选择。

    code Kotlin

    downloadcontent_copy
    expand_less

    复制代码
    class MainActivity : ComponentActivity() { ... }
  2. 如果你在使用传统的 XML 布局(View 系统)

    应该继承 AppCompatActivity(它是 ComponentActivity 的子类,多加了对旧版本 Android UI 主题的兼容代码)。

    code Kotlin

    downloadcontent_copy
    expand_less

    复制代码
    class MainActivity : AppCompatActivity() { ... }
  3. 什么时候继承 android.app.Activity?
    永远不要。 除非你在维护一个十年前、连 AndroidX 都没有引入的超级老旧项目,或者你在写极度精简的底层系统应用并且极其苛刻地要求包体积(不能引入任何 AndroidX 依赖)。

相关推荐
李艺为5 小时前
Fake Device Test作假屏幕分辨率分析
android·java
zh_xuan5 小时前
github远程library仓库升级
android·github
峥嵘life5 小时前
Android蓝牙停用绝对音量原理
android
小书房6 小时前
Kotlin的内联函数
java·开发语言·kotlin·inline·内联函数
czlczl200209256 小时前
IN和BETWEEN在索引效能的区别
android·adb
Volunteer Technology6 小时前
ES高级搜索功能
android·大数据·elasticsearch
北京自在科技7 小时前
Find Hub App 小更新
android·ios·安卓·findmy·airtag
lbb 小魔仙7 小时前
2026远程办公软件夏季深度横测:ToDesk、向日葵、网易UU远程全面对比,远控白皮书
android·服务器·网络协议·tcp/ip·postgresql
coding_fei7 小时前
AudioServer初始化过程
android
brucelee1868 小时前
Docker 运行 Android 模拟器
android·docker·容器