Activity — 是什么,Android 中的应用屏幕及其生命周期

作者: IT Sectr 发布日期: 2026-02-22 阅读时间: 7 分钟

Activity — Android 应用程序的基本组件,代表一个带有用户界面的屏幕。系统通过严格的生命周期管理屏幕 — onCreate、onResume 和 onDestroy 回调。每个 Activity 在 AndroidManifest.xml 中声明并通过 Intent 启动。关于 Android 历史的更多信息,请参阅 Google 官方文档

要点

  • Activity — Android 组件,代表一个带有 UI 的屏幕。通过生命周期管理
  • 生命周期 包括 6 个回调:onCreate、onStart、onResume、onPause、onStop、onDestroy
  • Intent — 启动 Activity 和在屏幕之间传递数据的机制
  • Manifest — 每个 Activity 必须在 AndroidManifest.xml 中注册
  • ViewModel — Jetpack 组件,用于在 Activity 重新创建时保存数据

什么是 Activity?

Activity — Android 应用程序的关键组件,提供与用户交互的窗口。每个 Activity 管理一个单独的屏幕:任务列表、登录表单、照片查看。Android 系统按需创建 Activity,并在其他应用程序需要内存时销毁它。

Activity 首次出现在 Android 1.0(2008)中,至今仍是界面的主要构建块。根据 Google(2026)的数据,Google Play 中 98% 的应用至少包含一个 Activity。在现代架构中,Google 推荐一个 Activity 搭配多个 Fragment,但经典的多屏幕应用仍然是一种常见实践。

Activity stack(back stack)— 存储导航历史的任务栈。当用户按下„返回“时,当前 Activity 被销毁,前一个 Activity 被恢复。系统自动管理栈,但开发者可以通过 launchMode 和 Intent 标志控制行为。

Activity 的生命周期

Activity 的生命周期 — 屏幕从创建到销毁所经历的状态和回调集合。理解生命周期至关重要:状态处理不当会导致内存泄漏、数据丢失和应用崩溃。

Android 系统按严格顺序调用回调。开发者重写所需的方法来初始化资源、保存数据和释放内存。每个回调都有一个对应配对:onCreate ↔ onDestroy,onStart ↔ onStop,onResume ↔ onPause。

回调目的开发人员操作
onCreate创建 Activity 时调用初始化 UI,订阅 ViewModel
onStartActivity 变为可见启动动画、相机、GPS
onResumeActivity 获得输入焦点恢复视频、定时器
onPauseActivity 失去焦点保存草稿,停止动画
onStopActivity 被其他屏幕隐藏释放重资源
onDestroyActivity 被销毁清理订阅,Closeable

Activity 的状态

区分 Activity 的四种状态:Running(onResume 活跃)、Paused(可见但无焦点)、Stopped(不可见)、Destroyed(已销毁)。系统在内存不足时可能会杀死处于 Stopped 状态的 Activity — 数据必须保存在 onSaveInstanceState 中。

生命周期方法:onCreate、onStart、onResume

让我们通过 Kotlin 示例来了解 Activity 生命周期的三个关键方法。onCreate — 入口点,只调用一次。这里通过 setContentView 绑定布局,初始化 RecyclerView,订阅 LiveData。onStart — Activity 对用户变为可见。onResume — Activity 获得焦点并准备交互。

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
        recyclerView.layoutManager = LinearLayoutManager(this)
        loadItems()
    }

    override fun onStart() {
        super.onStart()
        startLocationUpdates()
    }

    override fun onResume() {
        super.onResume()
        resumeVideoPlayer()
    }
}

在示例中,onCreate 初始化 RecyclerView 并加载数据。onStart 启动地理位置更新 — 一种只在屏幕可见时才能运行的资源。onResume 恢复在 onPause 中停止的视频。这种分隔可以防止不必要的后台工作。

在 AndroidManifest.xml 中声明 Activity

每个 Activity 必须在 AndroidManifest.xml 文件中声明。未经注册,系统将找不到屏幕并抛出 ActivityNotFoundException 异常。在清单中指定类名、主题、方向、launchMode 和 Intent 过滤器。

xml
<application
    android:allowBackup="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.MyApp">

    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".DetailActivity"
        android:parentActivityName=".MainActivity" />
</application>

exported 标志确定其他应用程序是否可以启动该 Activity。对于主屏幕 exported=true,对于内部屏幕 — false。parentActivityName 属性启用标准的„向上“导航(Up Navigation)。

通过 Intent 启动 Activity

Intent — 描述要执行操作的对象的对象。在 Activity 的上下文中,Intent 用于启动另一个屏幕并传递数据。Intent 可以是显式的(指向特定类)和隐式的(指向操作,由系统选择合适的组件)。

kotlin
// 显式 Intent — 使用数据启动 DetailActivity
val intent = Intent(this, DetailActivity::class.java).apply {
    putExtra("item_id", itemId)
    putExtra("item_name", itemName)
}
startActivity(intent)

// 在 DetailActivity 中接收数据
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""

为了从启动的 Activity 接收结果,使用 Activity Result API,它取代了已过时的 startActivityForResult。新的 API 是类型安全的、声明式的,并且与 Jetpack Compose 配合使用。

kotlin
private val getResult = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data?.getStringExtra("result_key")
    }
}

fun openPicker() {
    val intent = Intent(this, PickerActivity::class.java)
    getResult.launch(intent)
}

重新创建时保存状态

当屏幕旋转或配置更改时,Android 会重新创建 Activity — 依次调用 onDestroy 和 onCreate。如果不保存状态,用户将丢失输入的数据、滚动位置和选中的元素。为了解决这个问题,Android 提供了两种机制:onSaveInstanceStateViewModel

onSaveInstanceState 在调用 onDestroy 之前将简单数据保存到 Bundle 中。Jetpack 的 ViewModel 能够承受 Activity 的重新创建并在内存中保存数据,这对于复杂对象和网络请求更加高效。

kotlin
class MainActivity : AppCompatActivity() {

    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ViewModel 自动保存数据
        viewModel.items.observe(this) { items ->
            updateAdapter(items)
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
    }
}

Single Activity 架构和 Jetpack

Google 的现代方法 — Single Activity 架构,使用一个 Activity 和多个 Fragment。应用程序使用一个 MainActivity,所有导航由 Navigation Component 通过 NavHostFragment 执行。优势:集中式导航、每个屏幕共享 ViewModel、正确处理 Deep Links。

Jetpack Navigation Component 自动化了 back stack 管理、过渡动画和参数传递。NavHostFragment 放置在 Activity 的布局中,导航图(NavGraph)描述所有屏幕及它们之间的连接。这种方法被 Google 推荐用于新项目,并符合 Material Design 原则。

kotlin
class MainActivity : AppCompatActivity() {

    private val navController by lazy {
        findViewById<NavHostFragment>(R.id.nav_host_fragment)
            .navController
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 为 AppBar 配置 NavigationUI
        setupActionBarWithNavController(navController)
    }

    override fun onSupportNavigateUp() = 
        navController.navigateUp() || super.onSupportNavigateUp()
}

常见问题

Activity 与 Fragment 有什么不同?

Activity — 具有自己生命周期的完整应用程序屏幕。Fragment — Activity 内部 UI 的一部分,能够承受 Activity 的重新创建并依赖其 Lifecycle。Activity 是必需的,Fragment 是可选的。

一个应用中可以有多少个 Activity?

没有限制。每个屏幕通常代表一个独立的 Activity。对于简单的应用一个就足够了,对于多屏幕应用 — 5 到 20 个。Google 推荐一个 Activity 搭配多个 Fragment。

Activity 中的 launchMode 是什么?

launchMode 决定了 Activity 在任务栈中的创建方式。四种模式:standard(创建新实例)、singleTop、singleTask(任务中一个实例)和 singleInstance(隔离的任务)。模式在 AndroidManifest.xml 中设置。

如何在 Activity 之间传递数据?

通过 Intent — 一个包含附加数据(putExtra)的对象,可以放入基本类型、字符串、Parcelable 或 Serializable。对于回传结果,使用 Activity Result API — startActivityForResult 的现代类型安全替代品。

Android 中的 Configuration Change 是什么?

Configuration Change — 配置更改(屏幕旋转、语言更改、键盘)时 Activity 的重新创建。系统调用 onDestroy → onCreate。为了保存数据,使用 onSaveInstanceState 或 Jetpack 的 ViewModel。

总结

  • Activity — 基本的 Android 组件,代表一个带有用户界面的屏幕,通过生命周期进行管理
  • 生命周期 由六个回调组成:onCreate、onStart、onResume、onPause、onStop、onDestroy — 每个都有严格的用途
  • Intent 通过显式和隐式调用确保 Activity 的启动和屏幕间的数据传递
  • AndroidManifest.xml 要求每个 Activity 必须使用名称、主题、方向和过滤器进行注册
  • ViewModel 来自 Jetpack,在 Activity 重新创建时保存数据,取代 onSaveInstanceState 中的手动保存
  • Single Activity 架构 配合 Navigation Component — Google 为 Android 项目推荐的现代标准
  • launchMode 管理 Activity 在任务栈中的行为:从 standard 到用于隔离屏幕的 singleInstance

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读