一、Intent介绍
Intent的中文意思是“意图,意向”,Intent是程序中各组件之间进行交互与通讯的一种重要方式,不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据;
Intent一般可被用于启动活动、服务以及发送广播等场景;
组件名称 | 启动方法 |
---|---|
Activity | startActvity() startActivityForResult() |
Service | startService() bindService() |
Broadcasts | sendBroadcasts() sendOrderedBroadcasts() sendStickyBroadcasts() sendStickyOrderedBroadcast() |
二、Intent的七大属性
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也会产生新的页面,而不是重用之前的页面。】
三、Intent调用常见系统组件
// 调用浏览器
Uri webViewUri = Uri.parse("http://blog.csdn/bt_xxx");
Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);
// 调用地图
Uri mapUri = Uri.parse("geo:100,100");
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);
// 调用拨号界面
Uri dialUri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);
//Intent intent=new Intent(Intent.ACTION_VIEW,dialUri);
// 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" />
Uri callUri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_CALL, callUri);
// 调用短信界面
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "the sms text");
intent.setType("vnd.android-dir/mms-sms");
// 直接发短信
Uri smsToUri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", "the sms text");
// 发彩信
Uri mmsUri = Uri.parse("content://media/external/images/media/23");
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "the sms text");
intent.putExtra(Intent.EXTRA_STREAM, mmsUri);
intent.setType("image/png");
// 调用发邮件(这里要事先配置好的系统Email,否则是调不出发邮件界面的)
Uri emailUri = Uri.parse("mailto:abc@163.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);
// 直接发邮件
Intent intent = new Intent(Intent.ACTION_SEND);
String[] tos = { "abc@gmail.com" };
String[] ccs = { "abc@163.com" };
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "the email text");
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.setType("text/plain");
Intent.createChooser(intent, "Choose Email Client");
// 播放mp3
Uri playUri = Uri.parse("file:///sdcard/test.mp3");
Intent intent = new Intent(Intent.ACTION_VIEW, playUri);
intent.setDataAndType(playUri, "audio/mp3");
// 卸载应用
Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);
// 安装应用
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");
// 在Android Market中查找应用
Uri uri = Uri.parse("market://search?q=愤怒的小鸟");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
/** Intent利用Action属性中的ACTION_GET_CONTENT获取返回值: */
//选择图片 requestCode 返回的标识
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType( "image/*");
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
//添加音频
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType( "video/*");
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
//视频
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType( "video/*");
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
//录音
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType( "audio/amr");
intent.setClassName("com.android.soundrecorder","com.android.soundrecorder.SoundRecorder");
startActivityForResult(intent, requestCode);