Intent的基本知识
我们知道,Intent 是一个消息传递对象,使用它可以向其他Android组件请求操作。Intent的基本用途主要包括:启动 Activity、启动服务、传递广播。Intent分为显式Intent和隐式Intent。下面我通过启动Activity来讲解学习Intent。
Intent对象可以封装传递下面6种信息:
- 组件名称(ComponentName)
- 动作(Action)
- 种类(Category)
- 数据(Data)
- 附件信息(Extra)
- 标志(Flag)
下面来讲解这些信息
1、组件名称(CompomentName)
组件名称指定要访问的组件,但也是构建显式 Intent 的一项重要信息,如下所示:
Intent intent = new Intent(LoginActivity.this, HomeActivity.class); startActivity(intent); |
这样我们就启动了HomeActivity组件。
通过构造函数指定组件名称是我们常用的方式,此外还可以通过以下三种方法指定组件名称
Intent setClass (Context packageContext, Class<?> cls); Intent setClassName (Context packageContext, String className); Intent setClassName (String packageName, String className); Intent setComponent (ComponentName component) |
这里首先需要说明是的CompomentName对象,它定义了一个组件的基本信息,通过Android的源代码我们可以看到,其实不论哪种方法,最终Intent都会创建一个CompomentName对象封装被调用的组件信息。
其次我们来看一下Intent setClassName (String packageName, String className);这个方法。packageName指的是组件所属APP的包名。也就是AndroidManifest.xml中指定的包名,如下图所示:
最后,需要说明的是,如果传递字符串形式的className,必须指定类的全名,包括类所属的命名空间。下面给出了一个样例代码:
Intent intent = new Intent(); intent.setClassName("com.practise.salary.nvwa", "com.practise.salary.nvwa.HomeActivity"); startActivity(intent); |
设置Intent的组件名称,调用相关的组件,我们称为显式调用,一般用于调用APP自身的组件,当然,我们也可以通过显式调用其他APP的组件,后面讲解显示调用时,我们在来学习。
2、动作(Action)
所谓动作就是与Activity、Service、BroadcastRecvier绑定的一个字符串,通常在AndroidManifest.xml声明组件时,设置动作参数,如下图所示:
我们可以通过设置Action属性,调用相关的组件,这称为隐式调用。
一般我们通过Intent的setAction方法设置Intent的动作,这样系统会根据动作中指定的字符串查找匹配的组件。如下所示代码:
Intent intent = new Intent(); intent.setAction("android.intent.action.MAIN"); startActivity(intent); |
当我们定义自己的操作,建议将应用的软件包名称作为前缀,动作名称用大写。
3、种类(Category)
运行上面的代码,大家会发现,弹出了一个选择框,选在调用那个组件,如下图所示:
之所以会出现这种情况,是因为动作“android.intent.action.MAIN”对应的组件不止一个,Android系统无法判断到底调用那个组件(详细的筛选过程将在后面过滤规则中讲解)。
Intent的Category的就是为了解决这类冲突问题的,Category的设置也是在AndroidManifest.xml文件中完成,如下图所示:
Category也是一个字符串,我们可以通过addCategory为Intent添加Category,可以添加多个Category,如下面代码所示:
Intent intent = new Intent(); intent.setAction("com.practise.salary.nvwa.action.HOME"); /* 我们可以不用手动添加android.intent.category.DEFAULT,系统会自动添加这个Category */ intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent); |
我们可以通过文件夹、文件类比Category和Action。
4、数据(Data)
在Intent的隐式调用中,系统要根据请求对满足条件的组件进行筛选,这就是Intent的筛选机制。筛选条件除了Action、Category外,还有一个就是Data。此外Data还承担了简单的数据传递工作。
组件Data的申明如下图所示:
下面我们学习一下Intent的Data属性。
Data包括MIME Type和URI。
MIME Type指数据的类型,例如:video/mp4,video/avi通常我们通过
Intent setType (String type) 或者 Intent setTypeAndNormalize (String type) |
完成MINE Type的设置。不同之处在于setTypeAndNormalize可以规范MINE Type。
URI,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一资源名称的字符串,URI可以表示成如下格式:
scheme://host:port/path |
其中
- scheme:协议表示,如http,https,ftp,content等;
- host:主机名称
- port:端口号
- path:具体的资源路径;
我们常见的URL地址就是一种特殊的URI。
我们可以通过
Intent setData (Uri data) Intent setDataAndNormalize (Uri data) |
来设置Intent的URI,注意此处需要传递的是一个Uri对象,该对象封装了具体的URI,我们采用如下静态方法江URI字符串转换成URI对象。
Uri parse (String uriString) |
此外我们还可以调用setDataAndType一次性设置URI和MIME Type。
Intent setDataAndType (Uri data, String type) Intent setDataAndTypeAndNormalize(Uri data, String type) |
需要注意的是,当我们调用setType方法设置MIME Type,会自动清理URI的属性值,当调用setData方法来设置URI时,会自动清理MIME Type的值,如果要同时设置URI和MIMIE Type,必须使用setDataAndType方法。
关于如何通过Data进行过滤,后面我们会讲到,下面我们通过一个样例来讲解如何通过Data完成简单的数据传递。
我们通过显示调用Intent同时设置Intent的Data。代码如下:
Intent intent = new Intent(LoginActivity.this, HomeActivity.class); intent.setDataAndType(Uri.parse("content://findUser/20180910"), "nvwa/user"); startActivity(intent); |
在被调用的HomeActivity中,我们通过getItent()获取传递来的Intent。然后我们就可以通过
Uri getData () 或 String getDataString () |
获取URI,有了URI我们就可以解析出其中数据。下面给出被调用的组件的样例代码
Intent intent = getIntent(); Uri uri = intent.getData(); Log.v("URI参数传递", uri.getPath()); |
输出结果如下图所示:
Uri类提供了更多的方法用于处理Uri值,可参考Uri相关的帮助 https://developer.android.google.cn/reference/android/net/Uri。
5、附件信息(Extra)
通过Data只能传输比较简单的数据,Intent主要通过Extra完成组件之间的数据传递。
调用方通过intent的putExtra设置数据,被调用的组件通过getXXXExtra获取数据,代码如下所示:
调用方传递参数
Intent intent = new Intent(LoginActivity.this, HomeActivity.class); intent.putExtra("userName", "zhangw"); intent.putExtra("loginTime", Calendar.getInstance()); startActivity(intent); |
被调方获取参数
Intent intent = getIntent(); Log.v("Extra数据传递", intent.getStringExtra("userName")); |
我们分析Android代码可以发现,其实通过Exctra传递的是一个Bundle,我们可以把Bundle理解成一个键值对,他通过putXXX设置数据,通过getXXX读取数据。我们可以自己定义一个Bundle对象,进行数据的传递,下面给一个样例程序。
调用方传递参数
Bundle bundle = new Bundle(); bundle.putString("userName", "account"); bundle.putSerializable("loginTime", Calendar.getInstance()); intent.putExtras(bundle); |
被调方获取参数
Intent intent = getIntent(); Bundle bundle = intent.getExtras(); Log.v("登录时间", bundle.getSerializable("loginTime").toString()); |
输出结果如下图:
注意,调用方通过intent的getExtras获取传递的来的bundle。
6、标记(Flag)
Intent通过
Intent setFlags (int flags) |
设置标记。 关于标记的用法,后面我们用到后再给大家将,这并不表示这个概念不重要。
(张伟:2018年9月27日)
(转载时请注明来源)
Intent的基本知识相关推荐
- Android两个注意事项.深入了解Intent和IntentFilter(两)
深入理解Intent和IntentFiler(二) 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 在上一篇文章中,我们比較具体学习了&q ...
- Android四大组件总结
四大组件系列文章 Activity总结和补充:Activity总结和补充_fdsafwagdagadg6576的博客-CSDN博客 Android Binder&Aidl理解和补充:Andro ...
- Android 通过scheme跳转支付宝实现支付
实际上,扫码之后就是通过支付宝内置浏览器打开了h5,如果我能有个方法,可以触发让支付宝去打开支付的h5链接,那么就是相当于实现了唤起APP支付的功能了 于是就轮到了今天所说的scheme实现了功能 步 ...
- 应用程序基础知识:activity和intent——Android开发秘籍
应用程序基础知识:activity和intent --Android开发秘籍 v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#defaul ...
- android小知识之意图(intent)
android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity B ...
- Android 基础知识系列之 Intent 常用方法
极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能 本文主要是总结Intent 常用的方法,并封装成Utils类中 主要涉及以下内容 通 ...
- 看看android基础知识,谁帮我作答
无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...
- Framework 源码解析知识梳理(5) startService 源码分析
一.前言 最近在看关于插件化的知识,遇到了如何实现Service插件化的问题,因此,先学习一下Service内部的实现原理,这里面会涉及到应用进程和ActivityManagerService的通信, ...
- android intent例程,Android开发(四)| 探究活动(详解Intent+大量实例)
在Android的开发项目中,Activity(活动)是最容易吸引到用户的地方,因为相比于算法.架构,它是实际可见的. Activity是一个可以包含用户界面的组件,主要用于和用户进行交互.一个用户程 ...
- Intent对象详解(一)
Intent的定义: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, servic ...
最新文章
- 自己写的哈希表以及解决哈希冲突
- hive-数据倾斜记录分享
- 多项式输出-Java
- JAVA 手撕底层arrayList代码(arrayList的简单实现)
- CentOS7 3.项目持续交付脚本
- ​易生信-宏基因组2020 积微学术论坛:基于大数据整合准确预测土壤的枯萎病发生...
- 动感灯箱制作流程培训_从事广告行业20年老师傅,揭秘广告牌类型和制作工艺流程 !...
- Visual Studio 2017版本15.9现在可用
- Linux的文件权限与目录设置
- 从源码角度详解Java的Callable接口
- rda冗余分析步骤_文献综述,步骤与问题!
- Vue二次封装axios为插件使用
- 笨办法学Python(learn python the hard way)--练习程序39-40
- 施乐j75服务器电源管理系统,富士施乐推出印刷系统 Color J75 Press
- 8086汇编语言:8086CPU的各个引脚的功能讲解
- UltraCompare如何进行模块和线路模式合并?
- 小白入门——关于什么是区块链
- 计算机想ping一下网络,Ping命令以检测Windows7下的计算机网络速度
- 从COD着陆页设计优化谈起
- 阿里云CDN边缘图像处理功能内测