Intent(意图)主要是解决Android应用的各项组件之间的通讯。一个Intent是一组被封装好的消息,它本身包含一些组件感兴趣的属性,比如动作(Action)用来匹配哪个组件应该接收这个Intent,分类(Category)用来决定Intent的种类和如何启动目标Activity,数据(Data)用来传递资源信息,以及额外信息(Extra)用来传递数据。具体来说,一个Intent对象包括六个属性:组件名(Component Name)、动作(Action)、数据(Data)、分类(Category)、额外信息(Extra)和标志(Flag)。对它们的简要说明如图所示。
属性字段 | 名称 | 数据类型 | 获取方法 | 设置方法 |
---|---|---|---|---|
Component Name | 组件名 | CompomentName | getComponent | setComponent() setClass() setClassName() |
Action | 动作 | String | getAction | setAction() |
Data | 数据 | URI | getData() getType() | setData() settype() setDataAndType() |
Category | 分类 | String | getCategories() | addCategory()removeCategory() |
Extra | 额外信息 | 1、键值对。2、Bundle | 1、get***Extra()2、getExtra() | 1、putExtra()。2、putExtras() |
Flag | 标志 | Integer | getFlags() | setFlags() |
ComponentName(组件名)
组件名用来解决Intent的匹配问题,它可以设置,也可以不设置。设置了组件名的Intent叫做显式Intent,这种Intent的匹配时将直接使用组件名里的参数,没设置组件名的Intent叫做隐式Intent,这种Intent在匹配时将会从Action、Data(URI和Type)或Category中寻找匹配信息。一般在开发中,显示Intent用在一个应用程序内部的组件激活中:比如一个Activity开启所在应用内的Server或Activity。儿隐式Intent则常被用来激活其他应用程序的组件。
常用方法:
> Intent intent=new Intent(this,NewActivity.class);
> startactivity(intent);
与显式Intent相比,隐式Intent要复杂一些,这种方法下,通常要用IntentFilter来匹配组件,一个没有IntentFilter的组件只能接收显式Intent,而一个含有IntentFilter的组件则技能接收到显式Intent,又能接收到隐式Intent。Action、Data(URI和Type)和Category属性都可以用来在IntentFilter中进行匹配,我们可以使用其中的一个或者多个来完成匹配。
Action(动作)
用于描述Intent将要完成什么动作,开发者通常可以自定义动作,用在广播中,表示一个动作发生了,然后告知监听这个动作的组件去完成相应的事件。同时,Android系统也提供了一套内置的Action。
Action常量 | 目标组件 | 动作 |
---|---|---|
ACTION_CALL | Activity | 拨打Data指定的电话号 |
ACTION_EDIT | Activity | 给用户显示可编辑数据 |
ACTION_MAIN | Activity | 应用的入口函数 |
ACTION_SYNC | Activity | 同步服务器和移动设备上的数据 |
ACTION_DIAL | Activity | 将Data中的电话号码放入拨打号码界面中 |
ACTION_VIEW | Activity | 使用与Data中的数据相对应的应用程序来显示Data中指定的数据 |
ACTION_SEND | Activity | 发送数据 |
ACTION_SENDTO | Activity | 使用与Data中数据相对应的应用程序向Data中所指定的地址发送数据 |
ACTION_BATTERY_LOW | Broadcast Receiver | 一个电池电量低的警告 |
ACTION_TIMEZONE_CHANGED | Broadcast Receiver | 时区改变广播 |
ACTION_SCREEN_ON | Broadcast Receiver | 屏幕被打开 |
Data及内置Intent的使用
Data属性包括两部分,URI(通用资源标识符)和Type(MIME类型)。Data属性通常与Action属性配套使用。Action表示这个动作是什么,Data则表示一个动作所操作的数据。下面是一些常用的Data取值。
Data取值 | 说明 | 示例 |
---|---|---|
file:/// | 本地文件数据,后接文件路径 | feil:///mnt/sdcard/a.map3 |
mailto:// | 电子邮件,后接邮件地址 | mailto://xxx@163.com |
goe:// | 地理位置信息,后接经纬度 | goe:47.231810,-53.519061 |
smsto:// | 短信,后接目标号码 | smsto:+86186xxx |
tel:// | 电话,后接目标号码 | tel://+86186xxx |
content:// | 内容,后接内容定位 | content://contacts/people/1 |
http:// | 超文本,后接网络资源的URI | http://www.baidu.com |
下面为一些内置Action与Data组合使用的示例:
- 拨打电话:
Intent intent_call = new Intent(Intent.ACTION_CALL,
Uri.parse("tel://15383462318"));
startActivity(intent_call);
注意:需要在AndroidManifest.xml中声明打电话权限。
- 发送短信:
//发送附加电话号
Intent intent_smsto = new Intent(Intent.ACTION_SENDTO,
Uri.parse("smsto:15383462318"));
startActivity(intent_smsto);
//发送附加内容
Intent intent_smsto = new Intent(Intent.ACTION_SEND);
intent_smsto.setType("text/plain");
intent_smsto.putExtra(Intent.EXTRA_TEXT, "短信按钮");
startActivity(intent_smsto);
注意:笔者亲测smsto:后不用“//”。但书上有。
- 浏览网页:
Intent intent_uri = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://www.baidu.com"));
startActivity(intent_uri);
Category(分类)
Category是一个含有Intent的附加信息的字符串,这些信息可以决定哪些组件应该处理这个Intent。我们说过,当一个Intent是隐式Intent时,它可以使用Action、Data和Category进行匹配,所以Category也可以用来过滤Intent。在Intent对象中,可以放置多个Category,一些常用的由系统定义的Intent如下所示。
Category常量 | 意义 |
---|---|
CATEGORY_BROWSABLE | 目标Activity可以被浏览器使用超链接触发 |
CATEGORY_HOME | 显示HOME界面的Activity |
CATEGORY_LAUNCHER | 一个应用的入口Activity |
CATEGORY_DEFAULT | 默认值 |
Extra(额外信息)及Intent数据传递
Intent传递数据时,发起方要先封装好数据,然后接受方根据数据封装格式接收并处理数据。Intent使用直接或间接的键值对形式封装数据。
1、直接的键值对形式
发起方直接使用Intent对象的putExtra()方法,它以键值对的形式对数据封装进Intent中示例如下:
发起方:
Intent intent_value = new Intent(this, OtherActivity.class);
intent_value.putExtra("string", "OK了");
startActivity(intent_value);
接收方:
tv_other = (TextView) findViewById(R.id.other_textView);
Intent intent = getIntent();
String string_intent = intent.getStringExtra("string");
tv_other.setText(string_intent);
2、使用Bundle数据包
发起方可以把数据封装到一个Bundle的数据包中,然后在这个Bundle对象封装到Intent中,进行数据传递。
Bundle对象其实就是一个键固定为String的Map,它在Android中长被用来封装数据,当然我们使用Java中的各种Map也可以封装数据,但是如果想用在Intent中,必须将数据封装在Bundle里才可以使用。
发送方:
Intent intent_bundle = new Intent(this, OtherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("string", "bundle OK");
intent_bundle.putExtras(bundle);
startActivity(intent_bundle);
接收方:
tv_bundleIntent = (TextView) findViewById(R.id.other_textView);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("string");
tv_bundleIntent.setText(name);
Flag(标志)
flag属性多用在Task(作业)和Activity的Back Stack(Activity栈)的处理中,可以通过不用的flags来告诉系统一个Activity属于哪个Task,以及一个Activity被启动或停止后在Back Stack中的位置如何改变等。Android还提供了20多个Falgs取值供开发人员使用。