Intent概述
概念
- Activity基本设计理念是:减少组件间的耦合;因此在Android中提供了Intent来实现在应用程序组件与组件之间交互。
高内聚,低耦合
- Intent:意图, 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述;Android根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
- Intent最主要的作用就是,使用Intent启动三大核心组件 活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver),。
四大核心组件:Activity,BroadcastReceiver,Service,ContentProvider
intent对各个组件
Intent组成
- Component(组件):目的组件。
- Action (动作):用来表现意图的行动。
- Category (类别)ArrySet:用来表现动作的类别。
- Data (数据):表示与动作要操纵的数据。
- Type (数据类型):对于data范例的描写。
- Extras (扩展信息)Bundle:扩展信息。
- Flags (标志位)int:期望这个意图的运行模式。
Intent 的使用
- 显式Intent对象:直接指明Intent的目的组件
如直接给Component 赋值
- 隐式Intent对象:没有直接指明Intent目的组件,而是通过Intent其它属性来隐式指出Intent待加载的组件类
这里的其他组件指的是 Action Category Data Type
显式Intent
显式Intent:明确指定了当前Intent应该传递给哪个组件的Intent。
使用方法
- setClass(Context packageContext, Class<?> cls)
- setClassName(Context packageContext, String className),(content,目的组件的全限定名)
- setClassName(String packageName, String className),(目的组件所在的Pakage名,目的组件的全限定名)
这个方法可以调用其他App的Activity(目标Activity),需要在manifest中将目标Activity的exported属性设置为true,这样表示可以被其他程序调用
隐式Intent
隐式Intent:未明确指明待加载的组件类,但是在Intent属性中给出了待加载组件需要满足的特征。那么对应被启动的组件中接受此种属性。
- 组件的特征取决于在Activity配置中<intent-filter…/>元素的配置。<intent-filter…/>就是用于描述Intent的各种属性, <intent-filter…/>元素通常可包含如下子元素。
- 0~N个 <action…/> 子元素
- 0~N个 <category…/> 子元素
- 0~1个 <data…/> 子元素
- Action和Category属性都是普通的字符串,Action代表想要完成的一个“动作”,Category代表此动作的额外信息。
- 被启动的组件是不明确的,取决于Activity的<intent-filter…/>属性。例如:我提供的Action是=“com.example.intent.AAA”,那么就启动指定intent-filter的组件。Action和Category属性要结合使用。
Action属性使用时注意事项:
- Intent对象只能设定一个Action属性;表明某一个Intent只能加载一个组件。
- 若Intent为隐式Intent,且指明了Action属性,则待加载组件必须在AndroidManifest.xml文件中进行注册,且添加< intent-filter>元素并声明< action>子元素。
- 在AndroidManifest.xml文件中,一个组件的< intent-filter>元素中可以包含多个< action>子元素,表明该组件可以被不同的Intent加载。
- Action属性值可以使用内置的,也可以使用用户自定义的。
- 若符合Intent对象的待加载组件有多个,将以列表形式显示出来以供用户选择。
Category属性使用时注意事项:
- Intent对象可以添加多个Category属性;使用addCategory( )和removeCategory( )来添加或删除属性。ArraySet()
- 若Intent为隐式Intent,且指明了Category属性,则待加载组件需要在AndroidManifest.xml文件中进行注册,且添加< intent-filter>元素声明< category>子元素。
- 在AndroidManifest.xml文件中,一个组件的< intent-filter>元素中可以包含多个< category>子元素。
- category属性值可以使用内置的,也可以使用用户自定义的。
- 若Intent对象指明了action属性,但未指明category属性,则使用默认的category属性Intent.DEFAULT
android.intent.category.DEFAULT
data属性
- Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象,Uri对象通过如下形式的字符串表示
- 使用setData()方法
scheme://host:port/path
content://com.android.contacts/contacts/1
- scheme部分是content
- host部分是com.android.contacts
- port部分被省略了
- path部分是/contacts/1 (加上斜杠)
//设置data属性 “ data://net.onest.demo:1234/exm ”
intent.setData(Uri.parse("data://net.onest.demo:1234/exm"));//将字符串解析为URI对象
Type属性
- Type属性用于指定Data属性的MIME类型,这种MIME类型可以是任何自定义的类型,只要符合abc/xyz格式的字符串即可。
- 需要在data结点中设置mineType属性
- 使用setType()方法
data和type属性一般只需要一个,
通过setData方法会把type属性设置为null,
相反设置setType方法会把data设置为null,
如果想要两个属性同时设置,要使用**setDataAndType()**方法。
intent.setDataAndType(Uri.parse("data://net.onest.demo:1234/exm"),"language/java");
Extra属性
(见Activity的跳转)
Flags属性
- Activity和Task(活动栈)的关系。
- Task就像一个容器,而Activity就相当于填充这个容器的内容,第一个Activity会处于最下面,最后添加的Activity会在最顶端。从Task中取出Activity是从最顶端取出。
- Flags(标志位)表示Intent的运行模式。
// 如果Activity在Task存在,拿到最顶端,不会启动新的Activity
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
// 如果Activity在Task存在,将Activity之上的所有Activity结束掉
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// 默认的跳转类型,将Activity放到一个新的Task中
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 如果Activity已运行到了Task,再次跳转不会再运行这个Activity
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);