赞
踩
目录
用法1: 利用setComponent(packageName, className)方法:
用法2: 利用setClass(Context pkgContext, String className)方法:
Intent(意图)是一种消息传递机制。
它既可以在同一个应用程序内部的不同组件之间传递信息,也可以在不同应用程序的组件之间传递信息,还可以作为广播事件发布Android系统的相应信息。
Activity、Service和BroadcastReceiver之间是通过Intent进行通信的。
这四种组件之间的关系如图所示:
图3-1 四大组件关系图
Intent可以分成以下两类:
显式意图(Explicit intention):通过Component name(组件名称)来指定目标组件。通常用于应用程序内部消息,如在一个Activity中,使用startActivity(intent)启动另一个Activity。比如:
startActivity(new Intent(MainActivity2.this, AwardActivity1.class));
这里第一个参数为“包上下文”,第二个参数是要跳转到的类文件(Activity)。对于context(上下文)原本我也不是很清楚,不过由于写这篇博客的需求,特地找了篇挺全面的博客,这也是为了能及时回顾用的。(绝对干货!)安卓Context到底是什么?带你深度解析_乘风入海的博客-CSDN博客_安卓context是什么
隐式意图(Implicit intention):不需要指定组件名称。通常用于激活其他应用程序中的组件。
Intent过滤器是一种根据Intent中的action(动作) 、category(类型)和data(数据)等内容,对适合接收该Intent的组件进行匹配和筛选的机制。
Activity、Service和BroadcastReceiver组件都能够定义多个Intent过滤器来通知系统它们可以处理哪些隐式Intent。每个过滤器描述组件的一种能力以及该组件可以接收的一组 Intent.
显式Intent不需要通过Intent过滤器就可以将信息发给其目标组件,而隐式Intent需要通过Intent过滤器才可以将信息发给其目标组件。
Intent过滤器使用<intent-filter>节点,在应用程序的配置文件(AndroidManifest.xml文件)中进行相关配置。
系统收到一个启动 Activity的隐式Intent后,将会通过比较Intent 过滤器的 Action Category 和Data 这三个部分来查找最适合的Activity。
Intent对象由Component name、Action、Data、Category、Extras和Flags六个部分组成。
(1)ComponentName(组件名称):在显式Intent中,通过调用setComponent(ComponentName)方法或者setClass(Context, Class)方法,为Intent()设置component属性,进而实现Android的消息传递。
//实例化一个组件名称
方式1:
ComponentName component = new ComponentName("com.example.myapplication","com.example. myapplication.secondActivity");
ComponentName()的第一个参数是当前应用的包名,第二个参数是当前应用中要调用的Activity或者Service的全称(包名+类名)。
方式2.:
ComponentName component = new ComponentName(MainActivity.this,secondActivity.class);
//实例化一个Intent对象
Intent intent = new Intent();
//为Intent设置组件名称
intent.setComponent(component);
//启动Activity
startActivity(intent);
- Intent intent = new Intent();
- //为Intent设置组件名称
- intent.setClass(MainActivity.this, secondActivity.class);
- startActivity(intent);
setClass()的第一个参数为Context上下文,可以为application(全局上下文)、自定义Context、或者当前Activity,一般为当前Activity。第二个参数为目标Activity,可以是Activity、Service等。
- Intent intent = new Intent(MainActivity.this, secondActivity.class);
- startActivity(intent);
Intent()的参数与setClass()的参数相同。
(2)Action(动作):使用setAction()方法来设置Action属性,使用getAction()方法来获得Action属性。以下对这两个方法进行介绍。
setAction()方法:该方法用来为Intent设置动作,其语法格式如下:
public Intent setAction(String action) ;
其中,参数action是要设置的动作名称,通常为Android API提供的动作常量。
该方法的返回值是Intent对象。
getAction()方法:该方法用来获得Intent的动作名称,其语法格式如下:
public String getAction();
该方法的返回值是String字符串,表示Intent的动作名称。
Action常量 | 对应字符串 | 说明 |
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.actionVIEW | 显示指定数据 |
ACTION_EDIT | android.intent.action.EDIT | 编辑指定数据 |
ACTION_DIAL | android.intent.action.DIAL | 显示拨号面板 |
ACTION_CALL | android.intent.action.CALL | 直接向指定用户打电话 |
ACTION_SEND | android.intent.action.SEND | 向其他人发送数据 |
ACTION_SENDTO | android.intent.action.SENDTO | 向其他人发送消息 |
ACTION_ANSWER | android.intent.action.ANSWER | 接听电话 |
为了指定可接受的Intent Action,Intent过滤器通过< action >标签进行声明。例如以下动作验证设置该活动为启动活动(程序入口) :
<intent-filter>
<action android:name="android.intent.action.MAIN" />
...
</intent-filter>
(3)Data(数据):数据是作用于Intent上的数据的URI和数据的MIME类型,不同动作有不同的数据规格。
例如,如果动作字段是ACTION_CALL,那么数据字段就应该是一个tel:URI和要拨打的电话;如果动作字段是ACTION_VIEW,那么它的数据字段就应该是一个http:URI。
Intent数据应用相关的方法:
setData()方法:该方法用来为Intent设置URI数据,其语法格式如下:
public Intent setData(Uri data)
其中,参数data是要设置的数据的URI。该方法的返回值是Intent对象。
setType()方法:该方法用来为Intent设置数据的MIME类型,其语法格式如下:
public Intent setType(String type)
其中,参数type是要设置的数据的MIME类型。该方法的返回值是Intent对象。
setDataAndType()方法:该方法用来为Intent设置数据及其MIME类型,其语法格式如下:
public Intent setDataAndType(Uri data, String type)
其中,参数和返回值同setData ()方法和setType()方法。
getData()方法:该方法用来获得与Intent相关的数据,其语法格式如下:
public Uri getData()
该方法的返回值是URI,表示获取到的与Intent相关的数据。
getType()方法:该方法用来获得与Intent相关的数据,其语法格式如下:
public String getType()
该方法的返回值是String字符串,表示获取到的MIME类型。
为了指定可接收的Intent类型,Intent过滤器通过< category >标签进行声明。为了指定可接收的Intent数据,Intent过滤器通过< data >标签进行声明。例如:
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
...
</intent-filter>
每个<data>标签都可以指定一个URI和一个数据类型(MIME 媒体类型)。URI的每个部分都对应有单独的属性scheme、host、 port和path,格式如下:
<scheme>://< host>:< port>/< path>
//例如以下URI地址:
http://www.studyonline.com:8080/index.htm
其中,scheme是http ,host(主机)是www.studyonline.com ,port(端口)是8080 ,路径是index.htm 。
(4)Category(类型):Category(类型)指定以何种方式去服务Intent请求的动作。
表 常用Category
属性值 | 说明 |
CATEGORY_DEFAULT | Android系统中默认的执行方式,按照普通Activitv的执行方式执行 |
CATEGORY_HOME | 设置该组件为Home Activity |
CATEGORY _REFERENCE | 设置该组件为Preference |
CATEGORY_LAUNCHER | 设置该组件为在当前程序中优先被启动,通常与入口ACTION MAIN配合使用 |
CATEGORY_BROWSABLE | 设置该组件可以使用浏览器启动 |
为了指定可接收的Intent类型,Intent过滤器通过< category >标签进行声明。例如以下类型验证设置通常和android.intent.action.MAIN 动作一起使用,表明该活动是一个启动活动(程序入口):
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
...
</intent-filter>
为了通过类型验证,Intent中每个Category都必须与过滤器中相匹配。Intent中声明的Category 少于过滤器中声明的Category,验证可以通过。
(5)Extras(附加信息):Extras(附加信息)是Intent应用中需要关联到的某些特定信息。
Intent对象中有一系列的putXxx()方法用于插入各种附加数据,还有一系列getXxx()方法用于读取相应数据。这些方法与Bundle对象的方法类似,并且附加信息可以作为一个Bundle对象,使用putExtras()方法和getExtras()方法来插入和读取。
putExtra ()/ putExtras()方法:该方法用来为Intent添加附加信息,它有多种重载形式,其常用的重载的语法格式如下:
public Intent putExtra(String name, Parcelable value)
public Intent putExtra(String name, byte value)
public Intent putExtra(String name, CharSequence value)
public Intent putExtra(String name, Bundle value)
public Intent putExtra(String name, String value)
public Intent putExtras(Intent src)//Copy all extras in 'src' in to this intent.
public Intent putExtras(Bundle extras)//Add a set of extended data to the intent.
getExtras()方法:该方法用来获取Intent附加信息,其常用的重载的语法格式如下:
public Intent getExtras()
虽然使用时就那么短短的几行代码,但本人在用Intent进行页面或模块跳转(尤其是模块)时,总会出现一些bug。
出现这种错误是你在做模块跳转时,没有在当前模块的Manifest.xml中声明活动,由于没有声明,然后系统找不到,所以就报错咯。 如果是活动间的跳转问题不大,要是用它来做组件间的跳转的话,你一定会遇到问题,有些问题,虽然你解决了,但你可能依然不知道它是啥问题,你有这种经历吗?
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。