android中intent说明

Android Intent 详解
本文介绍了Android中组件间通信的核心机制——Intent。详细讲解了Intent如何用于数据传递,包括使用Bundle和putExtra方法来发送不同类型的参数。此外还讨论了Intent的显示与隐式声明的区别。

Android 中各个组件主要是通过Intent来通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

 

1.intent数据传递

 

intent中的数据传递,我们可以采用两中方式来实现,如果是简单的数据类型的数据可以直接采用Bundle来传递,而且bundle可以传递多个值,具体实现如下:

 

Bundle bundle =new Bundle();
bundle.putString("userName", "zhangsan");
bundle.putString("password", "123456");
intent.putExtras(bundle);

 

如果是传递集合或者对象那么需要采用intent中提供的putExtra方法,实现如下:

 

UserVO userVO =new UserVO(); //该对象需要实现Serializable接口
userVO.setUserName("wuhen");
userVO.setPassword("ling");
intent.putExtra("userVO", userVO);

 

2.关于intent的申明有显示申明和隐式申明,采用显示的申明非常的简单

 

Intent intent = new Intent(ActivityTestActivity.this, ActivityB.class);
startActivity(intent);

 

如果是隐式的申明稍微比较复杂点

Intent intent =new Intent();
intent.setClass(ActivityTestActivity.this, ActivityB.class);

或者设置setComponent


android提供了许多标注的action,例如打电话,发邮件,发短息等等。

<think> 嗯,用户这次明确要求了解Android开发中的Intent相关知识,并引用了四篇站内资料作为补充参考。从引用内容看,用户需要的是系统性的概念解析而非碎片化信息,尤其关注使用方法和底层原理的结合说明。 用户此前对NLP中intent的提问和当前Android intent的询问形成有趣对比——虽然术语相同,但NLP的意图识别是AI领域的抽象概念,而Android Intent是具体的编程机制。这种跨领域术语复用可能需要特别说明以避免混淆。 根据引用材料的关键信息点: - 引用[1]强调IntentAndroid组件化解耦设计中的核心地位 - 引用[2]精确定义了Intent作为通信中介的本质 - 引用[3]揭示了隐式IntentIntent Filter的匹配机制 - 引用[4]带出对象传递的实用需求 需要构建分层知识框架:先建立基础概念认知(显式/隐式区别),再深入通信机制(匹配原理),最后补充高阶用法(对象传递)。特别要注意引用[3]提到的PackageManagerService底层机制,这是很多开发者容易忽略的关键点。 对于原理部分,准备用双元结构图解法:既展示用户可见的API调用流程(如startActivity()),又同步揭示系统内部发生的匹配过程(IntentResolver查询)。对象传递方案要强调Parcelable与Serializable的性能差异,这是实际开发中的常见陷阱。 考虑到用户可能面临的真实开发场景,在代码示例中加入典型错误示范(如忘记android:exported导致的隐式调用失败)会更有实践价值。最后的技术栈建议需保持开放性,既要提及当前主流方案(如ViewModel+LiveData),也要说明传统方式(Bundle)的适用场景。 </think> 以下是关于 Android 开发中 Intent 的详细解析,结合核心原理与实践方法: --- ### 一、Intent 的本质与作用 1. **组件通信媒介** IntentAndroid 四大组件(Activity/Service/BroadcastReceiver/ContentProvider)间的通信桥梁,实现跨组件解耦[^2]。 - 显式 Intent:**直接指定目标组件类名** ```java Intent intent = new Intent(MainActivity.this, DetailActivity.class); startActivity(intent); ``` - 隐式 Intent:**通过动作(Action)和数据(Data)匹配目标** ```java Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.example.com")); startActivity(intent); ``` 2. **核心功能** - 启动组件(如跳转页面、启动服务) - 传递数据(支持基本类型及对象) - 广播事件(如系统电量低通知) --- ### 二、Intent 的底层原理 #### 隐式 Intent 匹配机制[^3] $$ \text{匹配流程} = \begin{cases} \text{Action 匹配} & \text{(必须声明)} \\ \text{Data 匹配} & \text{(URI 和 MIME 类型)} \\ \text{Category 匹配} & \text{(需兼容目标声明)} \end{cases} $$ ```mermaid graph LR A[隐式Intent] --> B{PackageManagerService} B --> C[查询所有 Intent-Filter] C --> D[匹配 Action/Data/Category] D --> E[返回符合条件的组件列表] ``` #### 关键组件: 1. **Intent Filter** 在 `AndroidManifest.xml` 中声明组件能力: ```xml <activity android:name=".WebActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="www.example.com" /> </intent-filter> </activity> ``` 2. **匹配失败排查** - 检查 `Action` 是否在目标 Filter 中声明 - 验证 `Data` 的 scheme/host/mimeType 是否一致 - 确认目标组件的 `android:exported="true"`(跨应用时必需) --- ### 三、数据传递高阶用法 #### 传递对象(需实现序列化)[^4] ```java // 自定义对象实现 Parcelable(高效替代 Serializable) public class User implements Parcelable { private String name; private int age; // Parcelable 接口实现(省略具体代码) ... } // 传递对象 Intent intent = new Intent(this, DetailActivity.class); intent.putExtra("user_data", new User("Alice", 25)); ``` #### 对比两种序列化: | **特性** | `Parcelable` | `Serializable` | |----------------|----------------------|---------------------| | 效率 | 高(内存直接读写) | 低(反射+IO) | | 实现复杂度 | 需手动编写代码 | 自动实现 | | 适用场景 | Android 组件间传递 | 网络传输/存储 | --- ### 四、最佳实践与常见问题 1. **选择启动模式** 通过 `Intent.setFlags()` 控制 Activity 栈,如: - `Intent.FLAG_ACTIVITY_NEW_TASK`:创建新任务栈 - `Intent.FLAG_ACTIVITY_CLEAR_TOP`:清除栈顶以上页面 2. **安全风险防范** - 接收 Intent 时校验数据合法性 - 敏感数据传递使用 `Intent.FLAG_GRANT_READ_URI_PERMISSION` 3. **性能优化** - 避免传递超过 1MB 的数据(用 `ContentProvider` 替代) - 使用 `Bundle` 压缩多个数据字段 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值