文章目录
- 一、Intent:组件间通信
- 二、活动的生命周期
- 三、活动的启动模式
-
- [1. standard(标准模式,默认)](#1. standard(标准模式,默认))
- [2. singleTop(栈顶复用)](#2. singleTop(栈顶复用))
- [3. singleTask(栈内唯一)](#3. singleTask(栈内唯一))
- [4. singleInstance(全局唯一独立栈)](#4. singleInstance(全局唯一独立栈))
- 四、总结
一、Intent:组件间通信
Intent 是 Android 中用于组件间通信的核心工具,最常见的用途就是页面跳转。它分为两种:显式 Intent 和 隐式 Intent。
1.显式 Intent:直接点名,直达目标
显式 Intent 直接指定目标组件的类名,是我们日常开发中最常用的方式。
java
// 参数1:当前上下文
// 参数2:目标Activity的class对象
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
特点与适用场景
- 优点:简单直接,稳定可靠,不会出现匹配失败的情况。
- 缺点:耦合度高,必须知道目标组件的类名。
- 适用场景:APP 内部页面跳转。
2.隐式 Intent:不点名,按条件匹配
隐式 Intent 不直接指定目标组件,而是通过配置动作、分类、数据 等条件,让系统去匹配能响应这些条件的组件。
核心三要素:
- Action(动作):定义要执行的行为,比如打开网页、打电话。
- Category(分类):动作的附加场景,隐式 Intent 必须配置 DEFAULT 分类。
- Data(数据):要操作的具体内容,必须是 Uri 格式(如网址、电话)。
自定义隐式跳转
发送方代码:
java
// 仅通过 Action 发送信号
Intent intent = new Intent("com.example.MY_ACTION");
startActivity(intent);
接收方配置:
xml
<activity android:name=".SecondActivity">
<intent-filter>
<!-- 与发送方的 Action 完全匹配 -->
<action android:name="com.example.MY_ACTION" />
<!-- 必须配置,否则匹配失败 -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
调用系统功能
这里以打开系统内置浏览器为例
java
// 参数1:系统内置 Action(查看内容)
// 参数2:要查看的网页数据(Uri格式)
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"));
startActivity(intent);
细节:
🔹 category 必须加 DEFAULT :系统在调用 startActivity 时,会自动给隐式 Intent 加上 DEFAULT 分类,如果你的过滤器没写,永远匹配失败。
🔹 data 不是必须的 :普通的自定义隐式跳转不需要 data,只有操作具体资源(网页、电话、文件)时才需要。
🔹 多个 intent-filter 匹配优先级:如果有多个 Activity 能匹配同一个 Intent,系统会弹出选择框让用户选择。
🔹 intent-filter 里的标签顺序不影响匹配 :action、category、data 的顺序不影响系统的匹配结果。
隐式Intent特点与适用场景:
- 优点:解耦,无需知道目标应用的包名和类名,可调用系统或第三方应用的功能。
- 缺点:配置繁琐,可能出现多个应用同时响应的情况。
- 适用场景:调用系统功能(浏览器、拨号、相册)、跨应用跳转。
二、活动的生命周期
| 方法 | 触发时机 | 关键作用 |
|---|---|---|
onCreate() |
活动第一次创建,仅执行 1 次 | 初始化布局、控件、数据,setContentView() 写在这里。 |
onStart() |
页面即将变为可见状态 | 开启动画、定位等非交互资源。 |
onResume() |
页面获取焦点,进入可交互状态 | 开始播放视频、计时器等核心业务。 |
onPause() |
页面失去焦点(被弹窗覆盖、切后台) | 暂停视频、计时器,保存临时数据,不能做耗时操作。 |
onStop() |
页面完全不可见 | 释放网络请求、播放器等占用大量内存的资源。 |
onDestroy() |
页面彻底销毁(finish() 或 APP 退出) |
关闭数据库、解绑监听、销毁线程,彻底回收所有资源。 |
补充:
onRestart()方法在页面从后台恢复可见时触发,介于onStop()和onStart()之间,日常开发用得较少。
高频场景流程:
- 打开页面:
onCreate→onStart→onResume - 跳转新页面:旧页面
onPause→onStop;新页面onCreate→onStart→onResume - 按返回键关闭:
onPause→onStop→onDestroy - 后台切回:
onRestart→onStart→onResume
三、活动的启动模式
Activity 是以任务栈的方式管理的,启动模式就是控制 Activity 如何入栈、是否复用实例。
1. standard(标准模式,默认)
- 规则:每次跳转都新建一个实例,直接压入栈顶。
- 特点:简单粗暴,可能导致栈内存在多个相同 Activity 实例。
- 适用场景:普通详情页、二级页面。
2. singleTop(栈顶复用)
- 规则:如果目标 Activity 已经在栈顶,则复用当前实例,不新建;否则新建。
- 触发复用 :会调用
onNewIntent(),不会重新走onCreate。 - 适用场景:防止连续打开多个相同顶部页面,如首页、聊天窗口。
3. singleTask(栈内唯一)
- 规则:整个任务栈内只能有一个该 Activity 实例。如果已存在,会清空它上面所有 Activity,将其置顶。
- 特点:常用于从多级页面一键返回首页。
- 适用场景:APP 的首页(MainActivity)。
4. singleInstance(全局唯一独立栈)
- 规则:单独开辟一个全新的、只存放它自己的任务栈,全局唯一。
- 特点:跨 App 单例,系统级应用。
- 适用场景:系统级弹窗、来电界面,日常开发几乎不用。
四、总结
- Intent 是组件间通信的信使,显式用于内部跳转,隐式用于跨应用或系统功能调用。
- 生命周期 管理 Activity 的状态变化,核心是成对的初始化和资源释放。
- 启动模式 控制 Activity 在任务栈中的行为,核心是实例复用和栈内顺序。