[TOC]
在Android开发工作中,Intent是我们经常需要打交道的一个类,我们可以用它来启动Activity、Service和Boardcast,Intent有七大属性:
- ComponentName
- Action
- Category
- Data
- Type
- Extra
- Flags
根据是否指定componentName,可以将Intent分为显式Intent和隐式Intent,大多数情况下我们使用的都是它的显式用法,在这里对其隐式用法做个整理并记录。
隐式Intent并不会明确指明我们的意图,而是指定了一系列action和category等信息,然后由系统帮我们过滤选出合适的活动去启动,可以用于不同应用程序之间,一般用来启动系统自带的Activity或Service组件。比如调用手机浏览器打开一个网页:
Intent intent = new Intent();
//显示Intent
//intent.setClass(this,SecondActivity.class);
//隐式Intent
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.jianshu.com/"));
startActivity(intent);
隐式Intent.gif
属性详解
ComponentName
表示要启动的组件的名称。
Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
//Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
这是一段很常见的代码,代表Intent的显式用法,等同于
ComponentName componentName = new ComponentName(this,SecondActivity.class);
intent.setComponent(componentName);
其实两种写法是一样的,打开源码一看便知,第一种写法的内部实现就是第二种写法。
Action
action为自定义的一个字符串,用来让系统过滤我们的意图,一般和category、intent-filter搭配使用,category至少有一个,可以多个。
//AndroidManifest中注册时
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="action.test"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
//代码中调用,category为 默认的default,故不用指定
Intent intent = new Intent();
intent.setAction("action.test");
startActivity(intent);
系统自带的Action
- ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。
每个Android应用至少包含一个此类型的Action声明。如果设置多个,则哪个在前,执行哪个。 - ACTION_VIEW: (android.intent.action.VIEW)显示指定数据。
例如上面的调用浏览器打开网页,同理根据数据的不同可以打开地图、发送短信、打开多媒体等等。 - ACTION_EDIT: (android.intent.action.EDIT)编辑指定数据。
- ACTION_DIAL: (android.intent.action.DIAL)显示拨号面板。
- ACTION_CALL: (android.intent.action.CALL)直接呼叫Data中所带的号码。
- ACTION_ANSWER: (android.intent.action.ANSWER)接听来电。
- ACTION_SEND: (android.intent.action.SEND)向其他人发送数据(例如:彩信/email)。
- ACTION_SENDTO: (android.intent.action.SENDTO)向其他人发送短信。
- ACTION_SEARCH: (android.intent.action.SEARCH)执行搜索。
- ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT)让用户选择数据,并返回所选数据。
Category
category是action的额外附加的类别信息。
常用Category属性常量
- CATEGORY_DEFAULT: (android.intent.category.DEFAULT)Android系统中默认的执行方式,按照普通Activity的执行方式执行。
- CATEGORY_HOME: (android.intent.category.HOME)设置该组件为Home Activity,将是设备启动后第一个显示的界面。
- CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER)设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN配合使用。
- CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE)设置该组件可以使用浏览器启动。
Data属性:
Data属性通常用于向Action属性提供操作的数据。Data属性的值是个Uri对象。
Uri的格式如下:scheme:// host:port/path
系统内置的几个Data属性常量:
- tel://:号码数据格式,后跟电话号码。
- mailto://:邮件数据格式,后跟邮件收件人地址。
- smsto://:短息数据格式,后跟短信接收号码。
- content://:内容数据格式,后跟需要读取的内容。
- file://:文件数据格式,后跟文件路径。
- market:// search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
- geo:// latitude, longitude:经纬数据格式,在地图上显示经纬度所指定的位置。
Type属性
设置MIME data类型(需小写,或者使用setTypeAndNormalize),主要是对data属性的一个说明,但通常情况下data和type有一个便可以了。
MIME type
//Intent源码
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}
//如果想同时设置data和type,可以调用此方法。
public Intent setDataAndType(Uri data, String type) {
mData = data;
mType = type;
return this;
}
Extra属性
一般用于数据传递。日常开发中经常使用,不再赘述。值得一提的是系统同样内置了一些key,可以用来携带短信内容等。
Flags属性
可以通过设置flags来控制Intent是怎么被处理的,所有的FLAG_ACTIVITY_* 格式的flag都服务于context.startActivity();所有FLAG_RECEIVER_* 格式的flag都服务于context.sendBroadcast()。
日常开发中通常用来表示Activity的启动模式:
- Intent.FLAG_ACTIVITY_CLEAR_TASK:在目标Activity启动之前,清除栈内的所有activity,该目标activity成为另一个栈的栈底,只能和FLAG_ACTIVITY_NEW_TASK联合使用。
- Intent.FLAG_ACTIVITY_CLEAR_TOP:如果栈内存在该activity的实例,则清除该实例上面的所有activity,使该实例位于栈顶。
- Intent.FLAG_ACTIVITY_NEW_TASK:另起一个activity栈。
- Intent.FLAG_ACTIVITY_SINGLE_TOP:如果栈内存在该activity的实例,且位于栈顶,则直接使用该实例,不重新创建。
网友评论