Intent的一些知识点

Intent的一些知识点

Intent的用途

Intent是一个消息传递对象。使用Intent向系统请求操作,主要包括:

  1. 启动Activity
  2. 启动Service
  3. 发送Broadcast

下图展示了启动Activity时,Intent在两个Activity之间如何传递的

startActivity过程

Intent类型

官方的说法:

  • 显式Intent:通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理Intent的应用
  • 隐式Intent:不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理

是否指定组件是区别显式和隐式Intent的关键。显式Intent启动指定的组件,而隐式Intent通过声明执行的操作向系统请求操作。

构造显式Intent

可通过Intent构造器、setComponent(ComponentName)setClassName(Context, String)setClassName(String, String)setClass(Context, Class<?>)指定组件。

Activity如何声明接收隐式Intent

Activity想要接收隐式Intent,必须在manifest中的声明中添加<intent-filter>元素,在<intent-filter>内部,可使用actiondatacategory三个元素的一个或多个指定要接收的Intent类型。

action

前提条件:一个Activity可以声明一个或多个action,未声明action表示不接受隐式Intent;一个Intent不设置或只能设置一个action

匹配条件:Activity声明的action必须包含想要接收的隐式Intentaction

category

前提条件:一个Activity可以声明一个或多个category,一个Intent也可以包含一个或多个category

重点:**Intent不存在没有category的情况,因为使用startActivitystartActivityForResult启动隐式Activity时会自动将CATEGORY_DEFAULT应用到Intent中,所以Activity中至少有一个android.intent.category.DEFAULT**

匹配条件:Activity声明的所有category必须包含Intent的所有category

data

data分为两部分:MIMEURIMIMEURI各自有匹配的规则,非常简单,这里就不说了。

前提条件:一个Activity可以声明0个、一个或多个data,一个Intent也可以包含0个或一个data

  1. Activity未声明data时,只能接受无dataIntent
  2. 只声明了URIActivity,只能接受只有且能够匹配URI部分的dataIntent
  3. 只声明了MIMEActivity,接受能够匹配MIMEdataIntent,或是能够匹配MIMEURIcontentfile类型数据的Intent
  4. 声明了URIMIMEActivity,只能接受URIMIME同时匹配的Intent

注意其中有点差异的是,之声明了MIME部分的Activity,可以接受contentfile类型URI数据的Intent

一个可接受隐式Intent的Activity的过滤器的友好设计

  1. 声明一个或多个想要接收的action
  2. 声明至少一个category————android.intent.category.DEFAULT,若想要被浏览器启动,还需要声明android.intent.category.BROWSABLE
  3. 声明一个或多个想要接收的data,若想要接收文件类型的data,可以只声明MIME
  4. 可声明多个<intent-filter>接收多种过滤器
  5. (很少使用)若是不想其他app启动,则可以添加"exported"=false

总结

这个规则其实很简单,我们通常会在打开相机、访问文件时使用隐式Intent调动系统组件。反过来,我们想在其他应用如浏览器打开我们的app时,就需要自己声明过滤器,这时就要站在编写<intent-filter>的角度来看待Intent的过滤规则,这是之前一直困扰我,没能够友好理解Intent的关键。


   转载规则


《Intent的一些知识点》 Mycroft Wong 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Ubuntu使用Docker安装gitlab和gitlab-runner Ubuntu使用Docker安装gitlab和gitlab-runner
Ubuntu 20.04使用Docker安装gitlab和gitlab runner实现CI/CD 安装配置gitlab1. Docker 拉取 gitlab 镜像docker pull gitlab/gitlab-ce:latest 2
2021-09-15
下一篇 
Permission 权限 Permission 权限
Permission 权限Android引入权限的目的是保护用户隐私。APP一定要在访问用户敏感数据(如短信服务)和系统功能(如相机、网络)时申请权限。对于不同的功能,系统可能会自动通过权限申请,也可能提示用户批准权限。 安卓系统安全架构的
  目录