【Android学习札记】Intent详解
2017-02-10 19:21
281 查看
一、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 | 设置该组件可以使用浏览器启动 |
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
4000
;
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);
相关文章推荐
- Android开发学习笔记:Intent的简介以及属性的详解
- Android项目学习—Intent的作用详解
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习之Intent详解
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习笔记:Intent的简介以及属性的详解【转】
- Android开发学习笔记:Intent的简介以及属性的详解
- Intent的Component,Action和Category属性详解-android学习之旅(五十)
- (转载)android学习之旅-Intent详解
- 【转载】Android开发学习笔记:Intent的简介以及属性的详解
- Android学习指南之八:详解Intent及其应用实例
- android开发学习之路(1)---- activity及intent基本详解(1)
- Intent的Component,Action和Category属性详解-android学习之旅(五十)
- Intent的Component,Action和Category属性详解-android学习之旅(五十)
- Android开发学习笔记:Intent的简介以及属性的详解
- Android开发学习笔记:Intent的简介以及属性的详解