第5章 使用Intent和IntentFilter进行通信

本章主要介绍Android系统中Intent的功能和用法,当Android应用需要启动某个组件时,总需要借助于Intent来实现。Android使用Intent封装了应用程序的“启动意图”,但这种“意图”并未直接与任何程序组件耦合。本章重点在于掌握Intent的各种属性的功能和用法,和在AndroidManifest.xml文件中配置元素。
上图!
第5章 使用Intent和IntentFilter进行通信
第5章 使用Intent和IntentFilter进行通信
【知识点】
·Intent的构成:
    Component:指定Intent的的目标组件的类名称。需要接受一个ComponentName对象,创建一个ComponentName需要制定包名和类名--这就可以唯一确定一个组件类。指定了Component属性的Intent已经明确了它将要启动哪个组件,是显式Intent。通过该属性来启动特定组件时,被启动组件几乎不需要使用<intent-filter.../>元素进行配置。
    Action:用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等,被启动组件对应的配置元素的<intent-filter.../>元素里至少要包括。一个Intent对象最多只能包括一个Action属性,程序调用
Intent的setAction(String str)方法来设置Action属性值。
    Category: 这个选项指定了将要执行的这个action的其他一些额外的信息,例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为*应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。一个Intent对象可以包含多个Category属性,程序可调用Intent的addCategory(String str)方法来为Intent添加。
    Data:要事实的具体的数据,一般由一个Uri变量来表示,Uri对象表示为如下形式的字符串:scheme://host:port/path。
    Type:用于指定Data所指定Uri对应的MIME类型。
    Ectra:一个Bundle对象,可以存入多组key-value对,是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
    Flag:用于为该Intent添加一些额外的控制旗标,Intent可调用addFlags()方法来为Intent添加。
综上可以看出,action、 data/type、category和extras 一起形成了一种语言,这种语言可以是android可以表达出诸如“给张三打电话”之类的短语组合。

·理解完Intent基本概念之后,使用Intent来实际去写一些代码应用,会发现使用Intent并不像其概念描述得那样难。以下是摘自网上的一些代码片段:

[代码]调用拨号程序     

// 给移动客服10086拨打电话
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

[代码]发送短信或彩信     

// 给10086发送内容为“Hello”的短信
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "Hello");
startActivity(intent);
// 发送彩信(相当于发送带附件的短信)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(intent);

[代码]通过浏览器打开网页     

// 打开Google主页
Uri uri = Uri.parse("http://www.google.com");
Intent intent  = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

[代码]发送电子邮件     

// 给someone@domain.com发邮件
Uri uri = Uri.parse("mailto:someone@domain.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(intent);
// 给someone@domain.com发邮件发送内容为“Hello”的邮件
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
// 给多人发邮件
Intent intent=new Intent(Intent.ACTION_SEND);
String[] tos = {"1@abc.com", "2@abc.com"}; // 收件人
String[] ccs = {"3@abc.com", "4@abc.com"}; // 抄送
String[] bccs = {"5@abc.com", "6@abc.com"}; // 密送
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_BCC, bccs);
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("message/rfc822");
startActivity(intent);

[代码]显示地图与路径规划     

// 打开Google地图中国北京位置(北纬39.9,东经116.3)
Uri uri = Uri.parse("geo:39.9,116.3");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
// 路径规划:从北京某地(北纬39.9,东经116.3)到上海某地(北纬31.2,东经121.4)
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

[代码]播放多媒体    

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/foo.mp3");
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

[代码]拍照     

// 打开拍照程序
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);
// 取出照片数据
Bundle extras = intent.getExtras();
Bitmap bitmap = (Bitmap) extras.get("data");

[代码]获取并剪切图片     

// 获取并剪切图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", "true"); // 开启剪切
intent.putExtra("aspectX", 1); // 剪切的宽高比为1:2
intent.putExtra("aspectY", 2);
intent.putExtra("outputX", 20); // 保存图片的宽和高
intent.putExtra("outputY", 40);
intent.putExtra("output", Uri.fromFile(new File("/mnt/sdcard/temp"))); // 保存路径
intent.putExtra("outputFormat", "JPEG");// 返回格式
startActivityForResult(intent, 0);
// 剪切特定图片
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
intent.setData(Uri.fromFile(new File("/mnt/sdcard/temp")));
intent.putExtra("outputX", 1); // 剪切的宽高比为1:2
intent.putExtra("outputY", 2);
intent.putExtra("aspectX", 20); // 保存图片的宽和高
intent.putExtra("aspectY", 40);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra("output", Uri.parse("file:///mnt/sdcard/temp"));
startActivityForResult(intent, 0);

[代码]安装和卸载程序  

Uri uri = Uri.fromParts("package", "com.demo.app", null); 
Intent intent = new Intent(Intent.ACTION_DELETE, uri); 
startActivity(intent);


[代码]进入设置界面    

// 进入无线网络设置界面(其它可以举一反三) 
Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); 
startActivityForResult(intent, 0);


最后,还有一个疑问
【问题】
·问:Type属性用于指定Data所指定Uri对应的MIME类型,MIME为何物?
  答:多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。由RFC 822转变而来的RFC 2822,规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架。
 MIME类型有2种形式:
①单个记录的格式: vnd.android.cursor.item/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains/122(一条列车信息的uri)的MIME类型是vnd.android.cursor.item/vnd.example.rail 
②多个记录的格式:vnd.android.cursor.dir/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains (所有列车信息)的MIME类型是vnd.android.cursor.dir/vnd.example.rail
网上有篇文章关于MIME的使用讲得还不错,http://www.cnblogs.com/hnrainll/archive/2011/11/16/2250980.html


第5章 使用Intent和IntentFilter进行通信

上一篇:ZOJ 2679 Old Bill ||ZOJ 2952 Find All M^N Please 两题水题


下一篇:HBaseclientAPI基本操作