在Android 中四大组件之间都可以进行相互的调用,但是一般在App中只是对于Activity ,Service,BroadcastReceiver他们之间的相互调用,但是他们之间是如何通讯的呢,这就为大家引出了我们的主角
intent 与 intent-filter
intent 翻译过来的意思是意图,而他的作用就是作为一个消息传递对象,将消息传递下去
intent-filter 就是一个和intent 进行搭配工作的组件, 它是是应用清单文件(AndroidManifest.xml)中的一个表达式,它指定该组件要接收的 Intent 类型。 例如,通过为 Activity 声明 intent-filte,您可以使其他应用能够直接使用某一特定类型的 Intent 启动 Activity。同样,如果您没有为 Activity 声明任何 intent-filte,则 Activity 只能通过显式 Intent 启动。
比如在Activity 中,如果要打开一个相机,那么就需要通过intent 的setAction传递一个动作,那么在系统自定义的Activity 中就会和传过来的action 进行匹配,如果两个相符,那么才可以打开照相机,否则就相应的操作反馈
intent 的作用
作用1: 启动一个Activity
作用2 : 启动一个服务
作用3 : 传递一个广播
intent 的类型
显示意图 : 按照名称打开一个指定的组件,如
Intent intents = new Intent(this,BasicActivity.class);
startActivity( intents );
其中 this 指的是一个context 的对象 BasicActivity.class 的类型是 Class<?> ,指的是一个Activity 的子类的.clss,一般会在开发者自己定义的Activity 进行调用
隐式意图 : 不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它.一般会在不知道要打开Activity 的时候进行调用,如打开相机,一般是开发者打开自己书写的Activity 的时候进行调用,如
Intent intents = new Intent();
intents.setAction( Intent.ACTION_MAIN );
intents.addCategory( Intent.CATEGORY_LAUNCHER );
startActivity( intents );
在开发者文档中对于现实意图和隐式意图有这样一段介绍
创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。
创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。
创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。 如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent 对象。 如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。
intent - filter 的内容
在intetnt-filter 中一般可以定义下面几种类型
组件名称: 这个组件在现实意图是一个必选项,但是在隐式意图确是一个可选项,因为这个组件名称也就是ComponentName 这个对象,(在清单文件中没有申明)
显示意图中他就是 startActivity( new Intent(this,BasicActivity.class) ); 中要调用的 Activity的class 对象
隐式意图中如果想要进行使用,那么可以通过 setComponent ,setClass ,setClassName 进行调用
操作: 指定要执行的通用操作(例如,“查看”或“选取”)的字符串,在清单文件中对应action的字段
数据 : 引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。提供的数据类型通常由 Intent 的操作决定,在清单文件中对应data的字段
类别 : 一个包含应处理 Intent 组件类型的附加信息的字符串,在清单文件中对应type 的字段
Extra : 携带完成请求操作所需的附加信息的键值对,在清单文件中没有对应
各个类型在清单文件中的定义数量
action, data, category,都可以定义多个
强制使用应用选择器
如果有多个选项满足,那么就会弹出一个选择框,让用户进行选择如
有一个 url 想要访问,但是在手机中有多个浏览器,那么就需要选择以哪种方式进行访问
如果要显示选择器,请使用 createChooser() 创建 Intent
Intent 匹配
使用 Intent 匹配。PackageManager 提供了一整套 query...() 方法来返回所有能够接受特定 Intent 的组件。此外,它还提供了一系列类似的 resolve...() 方法来确定响应 Intent 的最佳组件。 例如,queryIntentActivities() 将返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表,而 queryIntentServices() 则可返回类似的服务列表。这两种方法均不会激活组件,而只是列出能够响应的组件。 对于广播接收器,有一种类似的方法: queryBroadcastReceivers()。
限制对组件的应用
如果想要外部的组件不可以访问自己的组件,那么可以在清单文件中进行配置
将 exported 属性设置为 "false"