Activity — Android 应用程序的基本组件,代表一个带有用户界面的屏幕。系统通过严格的生命周期管理屏幕 — onCreate、onResume 和 onDestroy 回调。每个 Activity 在 AndroidManifest.xml 中声明并通过 Intent 启动。关于 Android 历史的更多信息,请参阅 Google 官方文档。
要点
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 的生命周期 — 屏幕从创建到销毁所经历的状态和回调集合。理解生命周期至关重要:状态处理不当会导致内存泄漏、数据丢失和应用崩溃。
Android 系统按严格顺序调用回调。开发者重写所需的方法来初始化资源、保存数据和释放内存。每个回调都有一个对应配对:onCreate ↔ onDestroy,onStart ↔ onStop,onResume ↔ onPause。
| 回调 | 目的 | 开发人员操作 |
|---|---|---|
| onCreate | 创建 Activity 时调用 | 初始化 UI,订阅 ViewModel |
| onStart | Activity 变为可见 | 启动动画、相机、GPS |
| onResume | Activity 获得输入焦点 | 恢复视频、定时器 |
| onPause | Activity 失去焦点 | 保存草稿,停止动画 |
| onStop | Activity 被其他屏幕隐藏 | 释放重资源 |
| onDestroy | Activity 被销毁 | 清理订阅,Closeable |
区分 Activity 的四种状态:Running(onResume 活跃)、Paused(可见但无焦点)、Stopped(不可见)、Destroyed(已销毁)。系统在内存不足时可能会杀死处于 Stopped 状态的 Activity — 数据必须保存在 onSaveInstanceState 中。
让我们通过 Kotlin 示例来了解 Activity 生命周期的三个关键方法。onCreate — 入口点,只调用一次。这里通过 setContentView 绑定布局,初始化 RecyclerView,订阅 LiveData。onStart — Activity 对用户变为可见。onResume — Activity 获得焦点并准备交互。
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 中停止的视频。这种分隔可以防止不必要的后台工作。
每个 Activity 必须在 AndroidManifest.xml 文件中声明。未经注册,系统将找不到屏幕并抛出 ActivityNotFoundException 异常。在清单中指定类名、主题、方向、launchMode 和 Intent 过滤器。
<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 用于启动另一个屏幕并传递数据。Intent 可以是显式的(指向特定类)和隐式的(指向操作,由系统选择合适的组件)。
// 显式 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 配合使用。
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 提供了两种机制:onSaveInstanceState 和 ViewModel。
onSaveInstanceState 在调用 onDestroy 之前将简单数据保存到 Bundle 中。Jetpack 的 ViewModel 能够承受 Activity 的重新创建并在内存中保存数据,这对于复杂对象和网络请求更加高效。
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())
}
}Google 的现代方法 — Single Activity 架构,使用一个 Activity 和多个 Fragment。应用程序使用一个 MainActivity,所有导航由 Navigation Component 通过 NavHostFragment 执行。优势:集中式导航、每个屏幕共享 ViewModel、正确处理 Deep Links。
Jetpack Navigation Component 自动化了 back stack 管理、过渡动画和参数传递。NavHostFragment 放置在 Activity 的布局中,导航图(NavGraph)描述所有屏幕及它们之间的连接。这种方法被 Google 推荐用于新项目,并符合 Material Design 原则。
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 内部 UI 的一部分,能够承受 Activity 的重新创建并依赖其 Lifecycle。Activity 是必需的,Fragment 是可选的。
没有限制。每个屏幕通常代表一个独立的 Activity。对于简单的应用一个就足够了,对于多屏幕应用 — 5 到 20 个。Google 推荐一个 Activity 搭配多个 Fragment。
launchMode 决定了 Activity 在任务栈中的创建方式。四种模式:standard(创建新实例)、singleTop、singleTask(任务中一个实例)和 singleInstance(隔离的任务)。模式在 AndroidManifest.xml 中设置。
通过 Intent — 一个包含附加数据(putExtra)的对象,可以放入基本类型、字符串、Parcelable 或 Serializable。对于回传结果,使用 Activity Result API — startActivityForResult 的现代类型安全替代品。
Configuration Change — 配置更改(屏幕旋转、语言更改、键盘)时 Activity 的重新创建。系统调用 onDestroy → onCreate。为了保存数据,使用 onSaveInstanceState 或 Jetpack 的 ViewModel。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。