Android Intent 机制解析 - Intent 是什么?作用是什么?

前言

Intent 相信大家都对它不陌生,startActiviy、startService、bindService、sendBroadcast…等常用方法都需要Intent来协助完成,那么,问题来了:“Intent 是什么?其作用是什么?其中有着怎样的机制呢?”

Intent 概述

Intent是一种运行时绑定(run-time binding)机制,它是一种基于某种想要被表露的意图的被动式数据结构,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。

四大基本组件中,Activity、Service、BroadcastReceiver 都需要通过Intent机制来激活,不同的组件需要不同的Intent传递方式

Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,Service或者BroadcastReceiver作响应。所以,不同类型的 Intent 消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。

Intent 结构

  • action – 想要实施的动作,例: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, etc.
  • data – 具体的数据,一般由以Uri表示,例:通讯录中的某条记录,会以Uri来表示
  • category – 为实施的动作添加的额外信息,即Intent组件的种类信息,一个Intent对象可以有任意个category,例:CATEGORY_LAUNCHER 意味着,它应该在启动器中作为顶级应用而存在
  • type – 显示指定Intent的数据类型(MIME类型 - 多用途互联网邮件扩展,Multipurpose Internet Mail Extensions),例:一个组件是可以显示图片数据的而不能播放声音文件。很多情况下,data类型可在URI中找到,比如content:开头的URI,表明数据由设备上的content provider提供。但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导
    MIME类型有两种:单个记录格式、多个记录格式
  • component – 指定Intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的,例如:Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);
  • extras – 附加信息,例如:it.putExtras(bundle) - 使用Bundle来传递数据;

显式与隐式 Intent

-* 显式Intent:通过指定具体的组件类*,通知应用启动对应的组件。例如:指定了component属性的、对Intent调用setComponent(ComponentName)或者setClass(Context, Class)的。
-* 隐式Intent:*没有指定具体comonent属性的Intent,设置了Action、Data、Category,让系统来筛选出合适的组件来进行调用(通过来筛选);这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

Intent 解析机制

对于显式Intent,目标组件很明确,故Android**不需要解析,Android需要解析的是间接Intent**,解析后,Intent即可映射给处理此Intent的Activity、Service或BroadcastReceiver。

解析机制
1. 通过查找已注册在AndroidManifest.xml的所有及其中定义的intent
2. 通过PackageManager来查找能够处理这个Intent的component,因为PackageManager能够获取设备上当前所安装的application package信息,解析过程主要是通过intent中的action、type、category三个属性来判断。
匹配规则:
1. 如果指定action,则目标组件的IntentFilter需要含有这个action
2. 如果Intent没有提供type,系统将从data中得到数据类型,类似action的匹配规则,目标组件必须包含Intent的数据类型,否则不匹配
3. 如果Intent中的数据不是content类型的Uri,而且Intent也没有明确指定type,将根据Intent中数据的scheme(如 http:或者mailto:)进行匹配,同上,Intent的scheme必须出现在目标组件的scheme列表中
4. 如果Intent指定了一个或者多个category,那么目标组件的类别列表需要包含全部所指定的类别。(如:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY)

资料来源

Intent - Android Developers
Android - Intent机制详解

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Intent是一种用于在应用程序之间传递消息的机制。它允许您启动新的Activity、Service或BroadcastReceiver等组件,或者在当前Activity中启动其他应用程序组件。Intent可以携带数据,并且可以在不同的应用程序之间共享。 在Android中,常见的Intent用法包括: 1.启动Activity Intent可以用来启动另一个Activity。例如,您可以使用以下代码启动一个名为"SecondActivity"的Activity: ``` Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); ``` 这将在当前Activity中启动一个新的Activity。 2.传递数据 Intent还可以用来在不同的Activity之间传递数据。例如,您可以使用以下代码将一个字符串数据传递到另一个Activity: ``` Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("message", "Hello from MainActivity"); startActivity(intent); ``` 在接收Activity中,可以使用以下代码获取传递的数据: ``` String message = getIntent().getStringExtra("message"); ``` 3.启动Service Intent可以用来启动另一个Service。例如,您可以使用以下代码启动一个名为"MyService"的Service: ``` Intent intent = new Intent(this, MyService.class); startService(intent); ``` 4.发送Broadcast Intent还可以用来发送Broadcast。例如,您可以使用以下代码发送一个名为"com.example.MY_BROADCAST"的Broadcast: ``` Intent intent = new Intent("com.example.MY_BROADCAST"); sendBroadcast(intent); ``` 这将发送一个Broadcast给所有注册了该Broadcast的应用程序。 5.指定Action Intent可以指定一个Action,以便接收方可以识别它并执行相应的操作。例如,以下代码指定了一个名为"com.example.ACTION_DO_SOMETHING"的Action: ``` Intent intent = new Intent(); intent.setAction("com.example.ACTION_DO_SOMETHING"); startActivity(intent); ``` 在接收方中,可以使用以下代码获取Action: ``` String action = getIntent().getAction(); ``` 6.设置类型 Intent可以设置一个数据类型,以便接收方可以根据该类型来处理数据。例如,以下代码指定了一个MIME类型为"image/jpeg"的数据类型: ``` Intent intent = new Intent(); intent.setType("image/jpeg"); startActivity(intent); ``` 在接收方中,可以使用以下代码获取数据类型: ``` String type = getIntent().getType(); ``` 以上是Android Intent的几种常见用法。使用Intent可以方便地在不同的组件之间传递数据和消息,并且可以执行各种操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值