上一篇
安卓基础之认识Activity组件
- 行业动态
- 2025-04-22
- 2
Activity是Android核心组件,承载UI交互,通过Intent启动,具备onCreate/onStart等生命周期回调,遵循任务栈管理,支持standard/singleTop等启动模式
Activity组件的定义与作用
Activity是Android应用程序的核心组件之一,代表用户界面的一个单独屏幕,每个Activity负责显示一个用户界面,并处理用户交互,一个应用通常由多个Activity组成,通过Intent在不同Activity之间跳转。
核心特点:
- 每个Activity对应一个独立的界面。
- 继承自
android.app.Activity
或androidx.activity.ComponentActivity
。 - 必须声明在
AndroidManifest.xml
中。 - 默认情况下,Activity会被压入返回栈(Back Stack),支持返回键操作。
Activity的生命周期
Activity的生命周期由系统回调方法控制,关键状态如下:
状态 | 回调方法 | 说明 |
---|---|---|
创建 | onCreate() |
初始化布局、加载数据 |
可见但不交互 | onStart() |
Activity即将对用户可见 |
前台活跃 | onResume() |
Activity可交互(用户操作焦点) |
暂停 | onPause() |
部分遮挡(如弹出对话框),保存数据 |
停止 | onStop() |
完全不可见(如切换到其他应用) |
销毁 | onDestroy() |
释放资源、回收内存 |
重新启动 | onRestart() |
从停止状态恢复时调用 |
典型场景:
- 当打开一个新Activity时,原Activity会依次调用
onPause() -> onStop()
,新Activity调用onCreate() -> onStart() -> onResume()
。 - 按返回键时,当前Activity调用
onPause() -> onStop() -> onDestroy()
,上一个Activity重新调用onRestart() -> onStart() -> onResume()
。
Activity的启动模式
通过Intent
启动Activity时,可通过android:launchMode
属性或Intent
的FLAG
标志指定启动模式,控制Activity实例的创建逻辑。
启动模式 | 行为描述 | 适用场景 |
---|---|---|
standard | 默认模式,每次启动均创建新实例 | 大多数普通页面跳转 |
singleTop | 若目标Activity已位于栈顶,则复用该实例 | 避免重复创建相同Activity |
singleTask | 栈中仅保留一个实例,后续启动均复用该实例 | 需要独立任务栈的页面(如浏览器) |
singleInstance | 单独的任务栈,无其他Activity可压入其栈 | 高度独立的模块(如闹钟设置) |
Activity间通信:Intent传参
通过Intent
携带数据启动Activity,常用方法:
- 传递简单数据类型:
Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key", "value"); // 字符串 intent.putExtra("num", 100); // 整数 startActivity(intent);
- 接收数据:
Intent intent = getIntent(); String value = intent.getStringExtra("key"); int num = intent.getIntExtra("num", 0); // 默认值0
- 传递对象:
- 实现
Serializable
或Parcelable
接口。 intent.putExtra("object", myObject);
- 实现
Activity与其它组件的关系
组件 | 关系描述 |
---|---|
Fragment | 一个Activity可包含多个Fragment,共享生命周期 |
Service | Activity可启动后台Service,处理长期任务 |
BroadcastReceiver | Activity可注册广播接收器,响应系统或应用事件 |
常见问题与解决方案
内存泄漏问题
- 原因:长时间持有
Context
引用(如静态变量、单例)。 - 解决方案:
- 使用
WeakReference
持有Context。 - 在
onDestroy()
中注销事件(如BroadcastReceiver
)。
- 使用
Activity重叠启动
- 现象:快速多次点击启动同一个Activity,导致多个实例压栈。
- 解决方案:
- 使用
singleTop
启动模式。 - 在
onNewIntent()
中处理新Intent,避免重复创建。
- 使用
相关问题与解答
问题1:Activity的onSaveInstanceState()
与onCreate()
中的Bundle
有什么区别?
解答:
onSaveInstanceState(Bundle outState)
:在Activity即将被销毁前(如配置变更)调用,用于保存临时状态数据。onCreate(Bundle savedInstanceState)
:在Activity重建时传入保存的Bundle
,用于恢复状态。
示例:保存文本输入内容,防止屏幕旋转后数据丢失。
问题2:如何启动一个Activity并清除返回栈?
解答:
- 使用
Intent
的FLAG_ACTIVITY_NEW_TASK
和FLAG_ACTIVITY_CLEAR_TASK
标志:Intent intent = new Intent(this, TargetActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
- 效果:目标Activity会成为新任务的根Activity,原返回栈被清