首页 > 系统 > Android > 正文

【Android学习札记】Intent详解

2019-11-09 14:39:00
字体:
来源:转载
供稿:网友

一、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);
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表