您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
本文亮点:彻底剖析Intent的使用以及原理

Android系列文章都在Android专栏中,欢迎小伙伴关注。

文章目录

  • 往期回顾
  • 源码地址
  • 前言
  • Intent的定义
  • Intent的构成
  • Intent的解析
    • 隐式Intent
  • 从一个应用启动另一个应用
  • 总结
  • 参考
  • Java知识图谱
  • 写在最后

往期回顾

❤️【Android精进之路-01】定计划,重行动来学Android吧❤️
❤️【Android精进之路-02】安装Android Studio,认识Android SDK,一步步学习❤️
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
❤️【Android精进之路-04】Android核心组件Activity,必须掌握的知识点(Activity是什么,生命周期是怎样的)❤️
❤️【Android精进之路-05】怎么创建Activity,如何启动另一个Activity,干货满满,建议收藏❤️

源码地址

https://gitee.com/jayxiang31/android-studio-projects/tree/master/LearnIntent

前言

上一篇文章我们详细介绍了Activity组件的创建以及传参。但是其中的关键人物Intent 却没有做过多的介绍。
这篇文章就来重点介绍下Intent。因为它不仅仅在创建Activity中被使用到,在后面介绍的另外两个组件Service和Broadcast中也会被用到。
一句话就是Intent很重要,我们必须要掌握它。
学习一门技术最重要的是学会查看其Api文档。这里介绍一个可访问的Android SDK的API文档 。
闲话少叙,直接进入今天的主题。

Intent的定义

Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。它主要应用在组件的启动阶段,通过它,你的应用程序可以向Android表达某种请求,Android系统会根据意愿的内容选择适当的组件进行响应。不同类型的组件有不同的传递Intent方法:

  1. 要激活一个新的Activity,可以调用startActivity()方法,或者startActivityForResult()方法
  2. 要启动一个新的Service,可以调用startService()方法,或者调用Context.bindService() 方法将调用此方法的上下文对象与service绑定。
  3. Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法可以发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。

Intent的构成

Intent的主要信息有:

  1. action(动作):表示要执行的一般操作,比如ACTION_VIEW,ACTION_SEND,ACTION_WEB_SEARCH等等。
  2. data(数据): 要操作的数据,例如联系人数据库中的个人记录,表示为Uri。
    一些常用的Action:
  3. ACTION_VIEW: 用于向用户展示数据
  4. ACTION_VOICE_COMMAND :用于启动语音命令
  5. ACTION_MAIN:用于作为主入口,即主Activity
  6. ACTION_EDIT: 用于显示用户编辑数据
  7. ACTION_DIAL: 用于用户拨打电话时指定号码
    除了主要的信息以外,Intent还有一些次要的信息。
  8. category(类别): 用于指定动作的类别或范畴
<category android:name="android.intent.category.LAUNCHER" />

表示该Activity会被显示在最上层的启动列表中,即在启动器启动时会首先显示给用户。
9. type(数据类型): 指定Intent的数据的显示类型(MIME类型)。通常,类型是从数据本身推断出来的。通过设置此属性,可以强制使用显式类型。
10. component(组件): 用于指定intent的组件的名称
11. extras(扩展信息): 扩展信息,用户可以通过它设置Activity之间传递的参数。例如:如果我们有一个发送邮件消息的操作,我们通过它传递主题,正文等数据

Intent的解析

Intent的解析方式有两种:第一种是显式Intent,第二种是隐式Intent。

  1. 显式Intent
    显示Intent就是直接设置组件名称或者设置组件的类名。它指定了特定的组件。比如:下面这样
Intent intent = new Intent(MainActivity.this, MyAty.class);

就明确指定了需要激活的Activity是MyAty。
2. 隐式Intent
隐式Intent,就是没有指定特定的组件。不过,它需要提供足够的信息提供Android系统以确定哪个可用组件最适合该Intent运行。

Intent intent = new Intent("com.jay.learnintent.MyAty");

这样说的还是有点笼统。那就举个例子吧!比如约人吃饭这个意图。显式Intent就是:我要约张三吃饭。明确指定了约饭对象是张三。到点了直接一个电话叫张三出来。而隐式Intent就是: 我要约个朋友吃饭。这里只确定了吃饭这个意图,具体的约饭对象没有具体指定,可能张三,可能是李四。到时候看哪个有空就约哪个出来。
显式Intent在上一篇文章已经有示例了,这里就不再赘述了。这里重点说说隐式Intent。

隐式Intent

首先创建一个名为MyAty的Activity。我们可以看到在manifests->AndroidManifest.xml 中会自动注册该Activity。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.jay.learnintent"><application  ......><activityandroid:name=".MyAty"android:exported="true"android:label="MyAty"></activity></application>
</manifest>

这里有一点需要说明的是android:name=".MyAty" 为啥名称为**.MyAty**。这是因为Android系统 接着我们需要在<activity></activity> 标签中加上如下两行配置:

 <intent-filter><!-- 指明行为方式是Activity --><category android:name="android.intent.category.DEFAULT" /><!--指明动作名称,可以根据此名称直接启动该Activity--><action android:name="com.jay.learnintent.MyAty" /></intent-filter>

这里通过<action android:name="com.jay.learnintent.MyAty" /> 指定该Activity的动作名称为com.jay.learnintent.MyAty ,这里的动作名称可以是任意的名称,之所以指定类的全路径名名是为了方便区分。
接着在MainActivity中通过隐式Intent的方式启动MyAty。

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnStartMyAty).setOnClickListener(view -> {//隐式IntentIntent intent = new Intent("com.jay.learnintent.MyAty");startActivity(intent);});}

运行结果是:

从一个应用启动另一个应用

隐式Intent 还有一个好处就是可以从一个应用程序的Activity启动另一个应用程序的Activity。下面定义了两个应用程序分别是app和app1。通过隐式Intent可以从app1的MainActivity启动app的MyAty。
app1的MainActivity的如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnStartAppMyAty).setOnClickListener(view -> {Intent intent = new Intent("com.jay.learnintent.MyAty");startActivity(intent);});}

Android系统会根据Intent中指定的action名称去查找合适的可用组件。

当两个组件的action名称相同时会怎么样呢?让我们接着来看下面这个例子:
在app中再定义一个名为FilterAty的Activity。然后在AndroidManifest.xml中配置其活动名称与MyAty的活动名称保持一致。
AndroidManifest.xml

     <activityandroid:name=".FilterAty"android:exported="true"android:label="FilterAty"><intent-filter><!-- 指明行为方式是Activity --><category android:name="android.intent.category.DEFAULT" /><!--指明Activity的名称,可以根据此名称直接启动该Activity--><action android:name="com.jay.learnintent.MyAty" /></intent-filter></activity><activityandroid:name=".MyAty"android:exported="true"android:label="MyAty"><intent-filter><!-- 指明行为方式是Activity --><category android:name="android.intent.category.DEFAULT" /><!--指明Activity的名称,可以根据此名称直接启动该Activity--><action android:name="com.jay.learnintent.MyAty" /></intent-filter></activity>

修改完配置之后首先运行app应用使FilterAty注入到应用中,也就是使配置生效。然后运行app1应用程序查看效果。
从效果图可以看出如果有有多个动作名相同的Activity的话,应用程序在激活Activity时会有一个弹框展示所有可用的Activity。你可以选择其中一个Activity作为激活对象。
当然,这种情况下也可以指定只激活特定的Activity。比如:这种情况下指定只激活FilterAty。

  1. 先修改AndroidManifest.xml
    <activityandroid:name=".FilterAty"android:exported="true"android:label="FilterAty"><intent-filter>........<data android:scheme="app"></data></intent-filter></activity>

在FilterAty的activity标签中增加<data android:scheme="app"></data> 配置,用于指定操作的数据是app。
然后,修改app1的MainActivity
2, Activity

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnStartAppMyAty).setOnClickListener(view -> {//启动指定的Activity  app://hello (任意参数)Intent intent = new Intent("com.jay.learnintent.MyAty", Uri.parse("app://hello"));startActivity(intent);});}
}

这里在Intent中指定了Uri是以app开头。

总结

本文详细介绍了Intent的各种应用场景。希望对读者朋友们有所帮助。

参考

Android SDK的官方文档
Android开发理解Intent的用途
Android应用开发中Intent的作用及使用方法

Java知识图谱

因为学习安卓需要良好的Java基础,这里推荐一下CSDN最新出的Java知识图谱,属实不错! 《Java知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。

我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。

我是码农飞哥,再次感谢您读完本文

写在最后

欢迎小伙伴可以点「下方卡片」

❤️【Android精进之路-06】真的有必要说说Intent,Intent就仙女的魔法棒❤️相关推荐

  1. ❤️【Android精进之路-01】定计划,重行动来学Android吧❤️

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. Android精进之路第一篇,确定安卓学习计划. 干货满满,建议收藏,需要用到时常看看.小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 文章目 ...

  2. ❤️【Android精进之路-02】安装Android Studio,认识Android SDK,一步步学习❤️

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文会重点介绍Android SDK以及如何安装Android Studio进行Android开发. 干货满满,建议收藏,需要用到时常看看.小伙伴 ...

  3. TensorFlow精进之路(三):两层卷积神经网络模型将MNIST未识别对的图片筛选出来

    1.概述 自从开了专栏<TensorFlow精进之路>关于对TensorFlow的整理思路更加清晰.上两篇讲到Softmax回归模型和两层卷积神经网络模型训练MNIST,虽然使用神经网络能 ...

  4. 《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享

    Go语言精进之路,从新手到高手的编程思想.方法和技巧 读书分享 1 本书定位 2 本书内容总览 3 选择本书的原因 4 小收获分享 第7-12条 真的不知道咋命名 第13-19条 能用--怎么用更好 ...

  5. Android框架之路——聊天Demo实现

    一.所用技术 GreenDao存储聊天数据: RecyclerView根据viewtype显示聊天界面: butterknife绑定view: 如果这些你还没有了解,你可以参考这些文章: Androi ...

  6. 测试/开发程序员的精进之路,热爱坚持并坚持独立思考......

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

  7. Android10.0系统启动之Zygote进程-[Android取经之路]

    [Android取经之路] 的源码都基于Android-Q(10.0) 进行分析 [Android取经之路] 系列文章: <系统启动篇> Android系统架构 Android是怎么启动的 ...

  8. Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​-[Android取经之路]

    摘要:本节主要来讲解Android10.0 selinux.kernel日志在logd中的实现,包括LogAudit.LogKlog的源码分析 阅读本文大约需要花费15分钟. 文章首发微信公众号:In ...

  9. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析-[Android取经之路]

    摘要:本节主要来讲解Android10.0 logd.logcat读写日志源码内容 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

最新文章

  1. ASP.NET中的页面指示标识
  2. Python踩坑指南(第三季)
  3. 饼图大小调整_别让这些细节毁了你的图表,饼图制作的三大准则和七大细节
  4. oracle两表链接序列跳序,Oracle学习之 序列(Sequence)
  5. idea编译的jsp存在哪里
  6. 智能合约重构社会契约 (4)预言机基础说明
  7. 深入理解JS中this关键字
  8. python导入标准库对象的语句_Python项目中如何优雅的import
  9. SAP Cloud for Customer和微信小程序的集成-原型开发示意图
  10. Android开发学习笔记-自定义对话框
  11. 2013年5月7日---JS中的正则
  12. 英特尔表示:元宇宙的路还很长
  13. 分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群
  14. 可见的轮廓线用虚线绘制_CAD制图初学入门教程:CAD软件中如何绘制轴测图?
  15. SKlearn——逻辑斯蒂回归(LR)参数设置
  16. linux0.11 80386段
  17. 2017 linux wine 迅雷,wine 迅雷下载安装(wine 迅雷极速版)【Linux上用迅雷7】
  18. Echarts 3d地球toolstips实现
  19. 吃透Redis系列(五):RDB和AOF持久化详细介绍
  20. excel两个表格数据对比_用Excel一键抓取网页表格数据

热门文章

  1. 任正非坚决反对年终奖:强调项目奖、及时奖
  2. 傲游浏览器怎么快速保存图片 快速保存功能使用技巧分享
  3. java学习17-采用数组、循环实现简单商品库存信息的查询与更改案列
  4. Oracle通过kafka同步数据到MySQL
  5. VR虚拟现实的工作原理
  6. 后盾php文档,后盾PHP微信网页授权接口技术文档
  7. OSEA中QRS波检测算法代码分析-未完待续
  8. 智能家居市场发展困境
  9. APICloud资料
  10. IPv6技术的几个问题?