我们知道,Intent 是一个消息传递对象,使用它可以向其他Android组件请求操作。Intent的基本用途主要包括:启动 Activity、启动服务、传递广播。Intent分为显式Intent和隐式Intent。下面我通过启动Activity来讲解学习Intent。

Intent对象可以封装传递下面6种信息:

  1. 组件名称(ComponentName)
  2. 动作(Action)
  3. 种类(Category)
  4. 数据(Data)
  5. 附件信息(Extra)
  6. 标志(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

其中

  1. scheme:协议表示,如http,https,ftp,content等;
  2. host:主机名称
  3. port:端口号
  4. 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的基本知识相关推荐

  1. Android两个注意事项.深入了解Intent和IntentFilter(两)

    深入理解Intent和IntentFiler(二) 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)     在上一篇文章中,我们比較具体学习了&q ...

  2. Android四大组件总结

    四大组件系列文章 Activity总结和补充:Activity总结和补充_fdsafwagdagadg6576的博客-CSDN博客 Android Binder&Aidl理解和补充:Andro ...

  3. Android 通过scheme跳转支付宝实现支付

    实际上,扫码之后就是通过支付宝内置浏览器打开了h5,如果我能有个方法,可以触发让支付宝去打开支付的h5链接,那么就是相当于实现了唤起APP支付的功能了 于是就轮到了今天所说的scheme实现了功能 步 ...

  4. 应用程序基础知识:activity和intent——Android开发秘籍

    应用程序基础知识:activity和intent --Android开发秘籍 v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#defaul ...

  5. android小知识之意图(intent)

    android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity  B ...

  6. Android 基础知识系列之 Intent 常用方法

    极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能 本文主要是总结Intent 常用的方法,并封装成Utils类中 主要涉及以下内容 通 ...

  7. 看看android基础知识,谁帮我作答

    无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...

  8. Framework 源码解析知识梳理(5) startService 源码分析

    一.前言 最近在看关于插件化的知识,遇到了如何实现Service插件化的问题,因此,先学习一下Service内部的实现原理,这里面会涉及到应用进程和ActivityManagerService的通信, ...

  9. android intent例程,Android开发(四)| 探究活动(详解Intent+大量实例)

    在Android的开发项目中,Activity(活动)是最容易吸引到用户的地方,因为相比于算法.架构,它是实际可见的. Activity是一个可以包含用户界面的组件,主要用于和用户进行交互.一个用户程 ...

  10. Intent对象详解(一)

    Intent的定义: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, servic ...

最新文章

  1. 自己写的哈希表以及解决哈希冲突
  2. hive-数据倾斜记录分享
  3. 多项式输出-Java
  4. JAVA 手撕底层arrayList代码(arrayList的简单实现)
  5. CentOS7 3.项目持续交付脚本
  6. ​易生信-宏基因组2020 积微学术论坛:基于大数据整合准确预测土壤的枯萎病发生...
  7. 动感灯箱制作流程培训_从事广告行业20年老师傅,揭秘广告牌类型和制作工艺流程 !...
  8. Visual Studio 2017版本15.9现在可用
  9. Linux的文件权限与目录设置
  10. 从源码角度详解Java的Callable接口
  11. rda冗余分析步骤_文献综述,步骤与问题!
  12. Vue二次封装axios为插件使用
  13. 笨办法学Python(learn python the hard way)--练习程序39-40
  14. 施乐j75服务器电源管理系统,富士施乐推出印刷系统 Color J75 Press
  15. 8086汇编语言:8086CPU的各个引脚的功能讲解
  16. UltraCompare如何进行模块和线路模式合并?
  17. 小白入门——关于什么是区块链
  18. 计算机想ping一下网络,Ping命令以检测Windows7下的计算机网络速度
  19. 从COD着陆页设计优化谈起
  20. 阿里云CDN边缘图像处理功能内测

热门文章

  1. 会员积分商城系统的功能介绍
  2. python爬虫爬取网页图片存储本地_Python爬虫抓取糗百的图片,并存储在本地文件夹...
  3. idm bt种子下载如何提升速度?
  4. 数据库原理与应用第三版何玉洁第二章课后题答案
  5. 小程序中自定义组件、父子传值的具体步骤(秒懂)
  6. 断网重启路由器就好_为什么总是断网重启路由器就好了
  7. 库存管理系统的设计与实现(代码)
  8. 不用工具直接从微软官网下载Win10正式版ISO镜像的技巧
  9. GitHub 上史上最全的 iOS 开源项目分类汇总
  10. 小米(MIUI)ROOT线刷教程