Intent的中文意思是“意图,意向”,Intent是程序中各组件之间进行交互与通讯的一种重要方式,不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据; Intent一般可被用于启动活动、服务以及发送广播等场景;
| 组件名称 | 启动方法 |
|---|---|
| Activity | startActvity()startActivityForResult() |
| Service | startService()bindService() |
| Broadcasts | sendBroadcasts()sendOrderedBroadcasts()sendStickyBroadcasts() sendStickyOrderedBroadcast() |
1)、ComponentName(组件名称)
指定了ComponentName属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显式Intent,没有指定ComponentName属性的Intent被称为隐式Intent。
Intent intent = new Intent();ComponentName cName = new ComponentName(MainActivity.this,NextActivity.class);intent.setComponent(cName);startActivity(intent);//实际上,以上的写法都被简化为以下写法:Intentintent = new Intent(MainActivity.this,NextActivity.class);startActivity(intent);2)、Action(动作) 指定Intent的执行动作,比如调用拨打电话组件,是一个字符串常量; 1,通常,Action、Category属性结合使用,定义这两个属性都是在配置文件的<intent-filter>节点中,也就是隐式Intent;
Intent intent = new Intent();intent.setAction("com.test.nextactivity");startActivity(intent);//可以简写成:Intent intent = new Intent("com.test.nextactivity");startActivity(intent);//在配置文件中注册Activity的时候需要声明<activity android:name=".NextActivity"> <intent-filter> <action android:name="com.test.nextactivity" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></activity>2、常用Action属性常量:
Intent对象不仅可以启动本应用内的程序组件,也可以启动Android系统的其他应用的组件,包括系统内置的程序组件(需要设置权限)。
| 动作名 | 常量值 | 描述 |
|---|---|---|
| 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 | 让用户选择数据,并返回所选数据 |
例如,获取通讯录的内容:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("vnd.android.cursor.item/phone");// 设置Intent Type 属性 startActivity(intent);例如,显示网页:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));// 将网址字符串解析成uri对象 startActivity(intent);3)、Category (类别):
Category属性为Action增加额外的附加类别信息。 常用Category属性常量:
| 类别名 | 常量值 | 描述 |
|---|---|---|
| CATEGORY_DEFAULT | android.intent.category.DEFAULT | Android系统中默认的执行方式,按照普通Activity的执行方式执行 |
| CATEGORY_HOME | android.intent.category.HOME | 设置该组件为Home Activity |
| CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 设置该组件为Preference |
| CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | 设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN配合使用 |
| CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 设置该组件可以使用浏览器启动 |
例如,实现页面跳转到HOME界面
Intent intent = new Intent();intent.setAction(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGOTY_HOME);startActivity(intent);4)、Data(数据) :
起到表示数据和数据MIME类型的作用。不同的action是和不同的data类型配套的。
1、Data属性通常用于向Action属性提供操作的数据。Data属性的值是个Uri对象。 Uri的格式如下:scheme://host:port/path
在<intent-filter>中data标签主要配置如下: android:scheme:用于指定数据的协议,如http; android:host:用于指定数据的主机部分,如www.baidu.com android:port:用于指定数据的端口,如80 android:path:用于指定路径 android:mimeType:用于指定可以处理的数据类型,允许通配符
2、系统内置的几个Data属性常量:
| 常量值 | 描述 |
|---|---|
| tel:// | 号码数据格式,后跟电话号码 |
| mailto:// | 邮件数据格式,后跟邮件收件人地址 |
| smsto:// | 短息数据格式,后跟短信接收号码 |
| content:// | 内容数据格式,后跟需要读取的内容 |
| file:// | 文件数据格式,后跟文件路径 |
| market://search?q=pname:pkgname | 市场数据格式,在Google Market里搜索包名为pkgname的应用 |
| geo://latitude, longitude | 经纬数据格式,在地图上显示经纬度所指定的位置。 |
例如,拨打电话:
Intent intent=new Intent();intent.setAction(Intent.ACTION_CALL);//intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel:1380080008"));startActivity(intent);5)、Type属性: Intent的Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。MIME只要符合“abc/xyz”这样的字符串格式即可。
例如,播放视频:
Intent intent = new Intent();Uri uri = Uri.parse("file:///sdcard/media.mp4");intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(uri, "video/*");startActivity(intent);6)、Extra(附加信息):
1、通过intent.putExtra(键, 值)的形式在多个Activity之间进行数据交换,也可以通过创建Bundle对象,再通过putExtras()和getExtras()方法来存取。
2、系统内置的几个Extra常量:
| 常量值 | 描述 |
|---|---|
| EXTRA_BCC | 存放邮件密送人地址的字符串数组 |
| EXTRA_CC | 存放邮件抄送人地址的字符串数组 |
| EXTRA_EMAIL | 存放邮件地址的字符串数组 |
| EXTRA_SUBJECT | 存放邮件主题字符串 |
| EXTRA_TEXT | 存放邮件内容 |
| EXTRA_KEY_EVENT | 以KeyEvent对象方式存放触发Intent的按键 |
| EXTRA_PHONE_NUMBER | 存放调用ACTION_CALL时的电话号码 |
几个例子:
//发送短信息Uri uri = Uri.parse("smsto:13200100001");Intent intent= new Intent();intent.setAction(Intent.ACTION_SENDTO);intent.setData(uri);intent.putExtra("sms_body", "信息内容...");startActivity( intent);//发送Email:Intent intent=new Intent();intent.setAction(Intent.ACTION_SEND);String[] tos={"android1@163.com"};String[] ccs={"you@yahoo.com"};intent.putExtra(Intent.EXTRA_EMAIL, tos);intent.putExtra(Intent.EXTRA_CC, ccs);intent.putExtra(Intent.EXTRA_TEXT, "The email body text");intent.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");intent.setType("message/rfc822");startActivity(Intent.createChooser(intent, "Choose Email Client"));7)、Flags(标记):
指示Android如何启动目标Activity,设置方法为调用Intent的setFlags方法。
常用的Flags参数有:
1、FLAG_ACTIVITY_CLEAR_TOP:(效果同Activity LaunchMode的singleTask) 如果在栈中已经有该Activity的实例,就重用该实例。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
2、FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity LaunchMode的singleTop) 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,而不会创建新的Activity对象。
3、FLAG_ACTIVITY_NEW_TASK:
4、FLAG_ACTIVITY_MULTipLE_TASK:
5、FLAG_ACTIVITY_BROUGHT_TO_FRONT:
6、FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
例如,将Activity栈中处于MainActivity主页面之上的Activity都弹出:
Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);例如:
如果依次启动了四个Activity:A、B、C、D。
在D Activity里,跳到B Activity,同时希望D 和 C 都finish掉,可以在startActivity(intent)里的intent里添加flags标记,如下所示:
Intent intent = new Intent(this, B.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);这样启动B Activity的同时,就会把D、C都finished掉。
如果B Activity的launchMode是默认的“standard”,则B Activity会首先finished掉旧的B页面,再启动一个新的Activity B。 如果不想重新再创建一个新的B Activity,而是重用之前的B Activity,可以将B Activity的launchMode设置为“singleTask”。【特别需要注意的是:在部分手机中,如三星手机。即便是singleTask也会产生新的页面,而不是重用之前的页面。】
新闻热点
疑难解答