当前位置:首页 > 行业动态 > 正文

安卓基础之认识Activity组件

Activity是Android核心组件,承载UI交互,通过Intent启动,具备onCreate/onStart等生命周期回调,遵循任务栈管理,支持standard/singleTop等启动模式

Activity组件的定义与作用

Activity是Android应用程序的核心组件之一,代表用户界面的一个单独屏幕,每个Activity负责显示一个用户界面,并处理用户交互,一个应用通常由多个Activity组成,通过Intent在不同Activity之间跳转。

核心特点

  • 每个Activity对应一个独立的界面。
  • 继承自android.app.Activityandroidx.activity.ComponentActivity
  • 必须声明在AndroidManifest.xml中。
  • 默认情况下,Activity会被压入返回栈(Back Stack),支持返回键操作。

Activity的生命周期

Activity的生命周期由系统回调方法控制,关键状态如下:

安卓基础之认识Activity组件  第1张

状态 回调方法 说明
创建 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属性或IntentFLAG标志指定启动模式,控制Activity实例的创建逻辑。

启动模式 行为描述 适用场景
standard 默认模式,每次启动均创建新实例 大多数普通页面跳转
singleTop 若目标Activity已位于栈顶,则复用该实例 避免重复创建相同Activity
singleTask 栈中仅保留一个实例,后续启动均复用该实例 需要独立任务栈的页面(如浏览器)
singleInstance 单独的任务栈,无其他Activity可压入其栈 高度独立的模块(如闹钟设置)

Activity间通信:Intent传参

通过Intent携带数据启动Activity,常用方法:

  1. 传递简单数据类型
    Intent intent = new Intent(this, TargetActivity.class);
    intent.putExtra("key", "value"); // 字符串
    intent.putExtra("num", 100);     // 整数
    startActivity(intent);
  2. 接收数据
    Intent intent = getIntent();
    String value = intent.getStringExtra("key");
    int num = intent.getIntExtra("num", 0); // 默认值0
  3. 传递对象
    • 实现SerializableParcelable接口。
    • 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并清除返回栈?

解答

  • 使用IntentFLAG_ACTIVITY_NEW_TASKFLAG_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,原返回栈被清
0