| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android学习(三)Intent -> 正文阅读 |
|
[移动开发]Android学习(三)Intent |
Intent是一个动作的完整描述,包含了产生组件、接收组件和传递数据信息。Android中提供了Intent机制来协助应用间的交互与通讯。Intent不仅可用于应用程序之间,也可用于应用程序内部 的 Activity / Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。 Intent由动作、数据、分类、类型、组件和扩展信息等内容组成 Action属性用于描述Intent要完成的动作: Data属性是执行动作的URI和MIME类型(执行的目标对象)? Action和data一般匹配使用(这两个属性是最重要的):? Category属性指明一个执行Action的分类(。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。): Component属性用于指明Intent目标组件的类名称 通常(隐式)intent是根据Intent中包含的其他属性的信息,比如Action、Data/Type、Category进行查找,最终找到一个与之匹配的目标组件。但是,如果指定了Component这个属性(显式),Intent则会 直接根据组件名查找到相应的组件,而不再执行上述查找过程。指定Component属性后, Intent的其他属性都是可选的。 Extra属性用于添加一些附加信息:例如发送一个邮件,就可以通过Extra属性来添加主题 (subject)和内容(body)。这边putExtra()一些信息就可以被在那边用getExtra()取出。 根据Intent寻找目标组件时所采用的方式不同,可以将Intent分为两类:直接Intent和间接 Intent。又称为显式Intent与隐式Intent 。 显式intent: 一般就是已知组件名 ? 直接传递到构造函数或者用set方法设置。 隐式intent(一般选择此方式): 隐式Intent,不指定具体的组件,但是它会声明将要执行的操作,从而匹配到相应的组件。这种方式通过Intent Filter过滤实现,过滤时通常根据Action、Data和Category属性进行匹配查找。 Android提供了两种生成Intent Filter的方式:一种是通过IntentFilter类生成;另一种通过在配置文件 AndroidManifest.xml中定义元素生成。 匹配原则: <intent-filter>标签中常用<action>、<data>和<category>这些子元素(其实就是表明所处的activity的属性或是能力,如果和程序中所需intent目标组件匹配则可以将其使用) 其中<action>属性不能为空,否则所有的Intent都会因匹配失败而被阻塞。 当发送一个隐式Intent后,系统会将它与设备中的每一个组件的过滤器进行匹配,匹配属性有Action、 Category、Data三个,需要这三个属性都匹配成功才能唤起相应的组件。 过滤器中有多个action项时,隐式Intent中的Action属性,与组件中的某一个过滤器的Action能够匹配(如果一个过滤器声明了多个 Action属性,只需要匹配其中一个就行,就已经说明能满足要求了),那么就算是匹配成功. 过滤器中有多个category项时,过滤器的Category属性内容必须是大于或者等于隐式Intent的Category属性时候,隐 式Intent才能匹配成功。如果一个隐式Intent没有设置Category属性,那么它可以通过任何一个过滤器 的Category匹配。 过滤器中有多个data项时,用于指定组件可以执行的数据。每个Data属性都可以指定数据的URI结构(数据地址)和数据MIME类型(数据类型)。 Data匹配时候,MIME类型和URI两者都会进行匹配,匹配规则如下: 如果过滤器未声明URI和MIME类型,则只有不含URI和MIME类型的隐形Intent才能 匹配成功 如果过滤器中声明URI但是未声明MIME类型(也不能从URI中分析出MIME类型), 则只有URI与过滤器URI相同且不包含MIME类型的隐式Intent才能匹配成功 如果过滤器声明MIME类型但是未声明URI,只有包含相同MIME类型但是不包含URI 的隐式Intent才能匹配成功 如果过滤器声明了URI和MIME类型(既可以是直接设置,也可以是从URI分析出来) ,只有包含相同的URI和MIME类型的隐式Intent才能匹配成功 总结一下就是:基本隐式intent和intentfilter的这URI和MIME两个属性无论可知未知哪个都必须一模一样。 URI匹配原则: Uri基本结构: [scheme:][//authority][path][?query][#fragment]???authority还可以细分为host和port [scheme:][//host:port][path][?query][#fragment]?? 在URI中,每个组成部分都是可选的,但是有线性的依赖关系 ①如果没有scheme部分,那么host部分会被忽略 ②如果没有host部分,那么port部分会被忽略 ③如果host部分和port部分都没有,那么path部分会被忽略 当进行URI匹配时候,并不是比较全部,而是局部对比,以下是URI匹配规则。 ①如果一个URI仅声明了scheme部分,那么所有拥有与其相同的scheme的URI都会通过 匹配,其他部分不做匹配 ②如果一个URI声明了scheme部分和authority部分,那么拥有与其相同scheme和 authority的URI才能匹配成功,path部分不做匹配 ③如果一个URI所有的部分都声明了,那么只有所有部分都相同的URI才能匹配成功 ?实例: 在Android世界的四大组件Activity、BroadcastReceiver、Service、Content Provider中,前三个都是 通过Intent来解析进行跳转的,Intent可以说是连接这四大组件的重要桥梁。 先学习intent实现三种activity跳转: 不带参跳转: Intent intent = new Intent(xxx.this(当前环境activity),xxx.class(目标activity)); startActivity(intent); 带参数跳转: 其实就是以键值对形式往在startActivity前往intet里面putExtra(键,值) 目标activity中直接getIntent().getExtra(键)。 ? 带返回值的跳转: 在跳转的Activity端,调用 startActivityForResult(intent, 1),跳转到 下一个Activity,其中第一个参数为传入的意图对象(里面封装了目的activity类和其余信息),第二个为设置的请求码; ? 跳转到第二个Activity后,调用 setResult(100, intent)方法可返回上一个 Activity,其中第一个参数为结果码,第二 个为传入的意图对象; ? 在第一个Activity通过onActivityResult()方 法获得返回的数据 得先判断是否是自己的那个请求以及请求的结果是否同意: ? ? |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:27:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |