【Android学习札记】Intent详解

一、Intent介绍

Intent的中文意思是“意图,意向”,Intent是程序中各组件之间进行交互与通讯的一种重要方式,不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据;
Intent一般可被用于启动活动、服务以及发送广播等场景;

组件名称启动方法
ActivitystartActvity()
startActivityForResult()
ServicestartService()
bindService()
BroadcastssendBroadcasts()
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_MAINandroid.intent.action.MAINAndroid程序入口。每个Android应用必须且只能包含一个此类型的Action声明。【如果设置多个,则哪个在前,执行哪个】
ACTION_VIEWandroid.intent.action.VIEW显示指定数据
ACTION_EDITandroid.intent.action.EDIT编辑指定数据
ACTION_DIALandroid.intent.action.DIAL显示拨号面板
ACTION_CALLandroid.intent.action.CALL直接呼叫Data中所带的号码
ACTION_ANSWERandroid.intent.action.ANSWER接听来电
ACTION_SENDandroid.intent.action.SEND向其他人发送数据(例如:彩信/email)
ACTION_SENDTOandroid.intent.action.SENDTO向其他人发送短信
ACTION_SEARCHandroid.intent.action.SEARCH执行搜索
ACTION_GET_CONTENTandroid.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_DEFAULTandroid.intent.category.DEFAULTAndroid系统中默认的执行方式,按照普通Activity的执行方式执行
CATEGORY_HOMEandroid.intent.category.HOME设置该组件为Home Activity
CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE设置该组件为Preference
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHER设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN配合使用
CATEGORY_BROWSABLEandroid.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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值