Activity
概述
Activity是Android应用程序的基本组件之一,它提供了一个用户界面,用户可以与之交互。了解Activity的生命周期、启动模式和任务栈对于开发高质量的Android应用至关重要。
生命周期
1. 基本生命周期方法
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 初始化Activity
}
override fun onStart() {
super.onStart()
// Activity变为可见
}
override fun onResume() {
super.onResume()
// Activity获取焦点,可与用户交互
}
override fun onPause() {
super.onPause()
// Activity失去焦点,但仍可见
}
override fun onStop() {
super.onStop()
// Activity完全不可见
}
override fun onDestroy() {
super.onDestroy()
// Activity被销毁
}
override fun onRestart() {
super.onRestart()
// Activity从停止状态重新启动
}
}2. 生命周期状态
- Created:Activity已创建但未显示
- Started:Activity可见但无法交互
- Resumed:Activity可见且可交互
- Paused:Activity部分可见但无法交互
- Stopped:Activity完全不可见
- Destroyed:Activity被销毁
启动模式
1. standard
- 默认启动模式
- 每次启动都创建新实例
- 可以多次创建同一Activity
2. singleTop
- 栈顶复用模式
- 如果目标Activity在栈顶,则复用
- 否则创建新实例
3. singleTask
- 栈内复用模式
- 在目标任务栈中只有一个实例
- 会清除其上的所有Activity
4. singleInstance
- 单实例模式
- 独占一个任务栈
- 系统中只有一个实例
任务栈(Task Stack)
1. 基本概念
- 任务栈遵循后进先出(LIFO)原则
- 每个任务栈包含一系列Activity
- Activity的启动模式影响任务栈行为
2. 管理方式
<!-- AndroidManifest.xml -->
<activity
android:name=".MainActivity"
android:taskAffinity="com.example.task"
android:launchMode="standard" />状态保存与恢复
1. 保存状态
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("key", "value")
}2. 恢复状态
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
savedInstanceState?.getString("key")
}面试常见问题
1. Activity生命周期的完整流程是什么?
-
完整流程:
- onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()
- 从后台恢复:onRestart() → onStart() → onResume()
-
典型场景:
- 启动Activity:onCreate() → onStart() → onResume()
- 按Home键:onPause() → onStop()
- 返回应用:onRestart() → onStart() → onResume()
- 按返回键:onPause() → onStop() → onDestroy()
2. onStart和onResume的区别?
-
onStart:
- Activity变为可见
- 但用户还不能与之交互
- 适合恢复UI状态
-
onResume:
- Activity获取焦点
- 用户可以交互
- 适合启动动画等
3. 横竖屏切换时Activity的生命周期?
-
默认情况:
- 销毁重建:onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume()
-
配置处理:
<!-- AndroidManifest.xml -->
<activity
android:configChanges="orientation|screenSize"
android:name=".MainActivity" />4. Activity的启动模式有什么区别?
-
standard vs singleTop:
- standard总是创建新实例
- singleTop在栈顶时复用
-
singleTask vs singleInstance:
- singleTask允许其他Activity在同一栈
- singleInstance独占一个任务栈
5. 如何避免Activity重建时丢失数据?
- 使用ViewModel:
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
}- 使用onSaveInstanceState:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable("data", myData)
}6. Activity的启动流程是什么?
-
Launcher调用过程:
- 点击图标
- Launcher进程通过Binder调用AMS
- AMS通知Launcher进入Paused状态
- AMS启动目标Activity所在进程
-
Activity创建过程:
- 创建ActivityThread
- 创建Application
- 创建Activity实例
- 调用onCreate方法
7. Activity的任务栈是什么?
-
基本概念:
- 用于管理Activity实例
- 遵循LIFO原则
- 可以跨应用
-
管理方式:
- taskAffinity属性
- launchMode属性
- Intent的Flag
最佳实践
-
生命周期管理
- 使用LifecycleObserver
- 合理释放资源
- 避免内存泄漏
-
状态保存
- 使用ViewModel
- 合理使用onSaveInstanceState
- 持久化重要数据
-
启动模式选择
- 根据业务需求选择
- 注意任务栈管理
- 避免过度使用singleInstance
注意事项
-
性能优化
- 避免在生命周期方法中执行耗时操作
- 合理使用懒加载
- 及时释放资源
-
内存管理
- 防止内存泄漏
- 正确处理配置变更
- 合理使用进程优先级
-
用户体验
- 保持状态一致性
- 平滑处理屏幕旋转
- 合理处理后台恢复