涉及到的一些名词的解释: Uri
intent是啥子,intent的干嘛用的,intent经常使用方式是什么,intent的使用有什么需要注意的,intent是如何匹配相应的组件去实现的。
intent如何启动一个东西的例子实在是太多了,这里不对intent的具体应用做列举。只是和基础不是很好的朋友一起认识一下 intent和 intent filter
Intent 是 组件之间传递信息的纽带,它使用的范围就是启动3大组件,activity,Service,broadcast。
intent启动方式为两种:显示,隐式。显示启动,你知道你想启动的是啥,让他直接去接管你想要做的事。隐式,你表达了一个行为的意图,然后让能做的去做。
简单的介绍一下显示启动,下面会详细介绍隐式启动,因为隐式启动涉及到 关于intent匹配的问题。
显示启动,简单粗暴的告诉系统我要启动的组件,通过的方式是:设置CompinentName 这是个什么鬼东西:它有两个字段,一个是packagename ,一个是class
也就是说 可以指定 哪个应用包的哪个组件启动。我们可以通过这个方法启动别的app的组件。setClassName setClass 还有一些方式都是大家常用的就不多列举了。
Intent过滤器
说到隐式启动必然先要知道 intent的过滤器。在Manifest文件中进行定义,作用就是筛选intent,也就是说他告诉系统,这个组件只接收满足我这些条件的intent。这里有三个参数作为 筛选的参考: <action> <data> <category> 分别是 (我能干啥),(我需要使用的家伙事是啥,是啥类型的),(我能接收人是啥样的)。
来个例子
<action android:name="android.intent.action.SEND"/>(我能发) <category android:name="android.intent.category.DEFAULT"/>(我啥样的人都接收(默认的)) <data android:mimeType="text/plain"/>(我用的家伙事是文字)
<action android:name="android.intent.action.SEND"/>(我能发) <action android:name="android.intent.action.SEND_MULTIPLE"/>(我能群发) <category android:name="android.intent.category.DEFAULT"/>(谁让我干 我都干) <data android:mimeType="application/vnd.google.panorama360+jpg"/>(我要的家伙事是 图片类型的,音频类型的) <data android:mimeType="image/*"/> <data android:mimeType="video/*"/>
<action android:name="android.intent.action.MAIN" />(我是关键) <category android:name="android.intent.category.LAUNCHER" />(我只接收能让我启动的人)
这里详细介绍一下 <data> 它由两部分组成 一个是uri 一个是MIME
若要同时设置 URI 和 MIME 类型,请勿调用 setData()
和 setType()
,因为它们会互相抵消彼此的值。请始终使用 setDataAndType()
同时设置 URI 和 MIME 类型。
声明这些之后就可以接收隐式Intent了
构建Intent
我们仔细研究一下 一个Intent 对象由哪些成分组成 :ComponentName action data extra category flags(这个意图的运行模式 例如activity的 singletop)
Comontent : 目的组件, 显示启动的象征,直接决定了要启动的组件
action :行为意图 ,和过滤器中的 <action>进行匹配,用户可以自己在Manifest自定义action
data : uri 我们可以理解为数据的地址
category : 动作的类型,默认是default 配合action 帮助系统选定适合的组件。自定义类别:用户可以在Manifest文件中自定义category
MIME : 数据的mime类型,也可以理解为文件格式
extras: 额外信息,不是用于匹配Intent过滤器的,只是负载了一些额外的信息。
Flags : 例如希望 activity的运行模式是 singletop
隐式启动当中我们需要注意的是 我们要先去了解系统中是否有满足我们Intent的 过滤器
这里需要执行这样的判断
if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
待定Intent
这个是干嘛用的? 常用于三种情况: 使用桌面小工具时需要执行的Intent, 希望在未来的某个时间执行Intent 。
PindingIntent 的创建方法 getActivity getService getBroadcast