您的位置:首页 > 移动开发 > Android开发

Intent详解

2015-05-30 20:20 295 查看
Intent(意图)主要是解决Android应用的各项组件之间的通讯。一个Intent是一组被封装好的消息,它本身包含一些组件感兴趣的属性,比如动作(Action)用来匹配哪个组件应该接收这个Intent,分类(Category)用来决定Intent的种类和如何启动目标Activity,数据(Data)用来传递资源信息,以及额外信息(Extra)用来传递数据。具体来说,一个Intent对象包括六个属性:组件名(Component Name)、动作(Action)、数据(Data)、分类(Category)、额外信息(Extra)和标志(Flag)。对它们的简要说明如图所示。

属性字段名称数据类型获取方法设置方法
Component Name组件名CompomentNamegetComponentsetComponent() setClass() setClassName()
Action动作StringgetActionsetAction()
Data数据URIgetData() getType()setData() settype() setDataAndType()
Category分类StringgetCategories()addCategory()removeCategory()
Extra额外信息1、键值对。2、Bundle1、get***Extra()2、getExtra()1、putExtra()。2、putExtras()
Flag标志IntegergetFlags()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_CALLActivity拨打Data指定的电话号
ACTION_EDITActivity给用户显示可编辑数据
ACTION_MAINActivity应用的入口函数
ACTION_SYNCActivity同步服务器和移动设备上的数据
ACTION_DIALActivity将Data中的电话号码放入拨打号码界面中
ACTION_VIEWActivity使用与Data中的数据相对应的应用程序来显示Data中指定的数据
ACTION_SENDActivity发送数据
ACTION_SENDTOActivity使用与Data中数据相对应的应用程序向Data中所指定的地址发送数据
ACTION_BATTERY_LOWBroadcast Receiver一个电池电量低的警告
ACTION_TIMEZONE_CHANGEDBroadcast Receiver时区改变广播
ACTION_SCREEN_ONBroadcast 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://超文本,后接网络资源的URIhttp://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取值供开发人员使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 方法 Intent