Android Intent

分享到:

Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做"查看"动作,此动作对应的查看对象是"某联系人",然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。为了让大家更好理解本章最后列举了一些Intent常用代码

一、Intent的显式调用和隐式调用

显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。
隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。
而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。

显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
说明:Android系统使用IntentFilter来寻找与隐式Intent相关的对象。

显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。

隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。

而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。

Android系统寻找与Intent请求意图最匹配的组件具体的选择方法 是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。

如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
Android如何知道应用程序能够处理某种类型的Intent请求呢?这需要应用程序在Android-Manifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。

一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。
而一个声明了IntentFilter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和 IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准:
Action
Data
Category
而Extra和Flag在解析收到Intent时是并不起作用的。

二、Intent 调用其它组件的方法

组件名称 方法名称
Activity startActivity()
startActivityForResult()
Service startService()
bindService()
Broadcasts sendBroadcast()
sendOrderedBroadcast()
sendStickyBroadcast()

三、常用Intent Action常量及含意对照表

常量名称

常量值

意义

ACTION_MAIN

android.intent.action.MAIN

应用程序入口

ACTION_VIEW

android.intent.action.VIEW

显示数据给用户

ACTION_ATTACH_DATA

android.intent.action.ATTACH_DATA

指明附加信息给其他地方的一些数据

ACTION_EDIT

android.intent.action.EDIT

显示可编辑的数据

ACTION_PICK

android.intent.action.PICK

选择数据

ACTION_CHOOSER

android.intent.action.CHOOSER

显示一个Activity选择器

ACTION_GET_CONTENT

android.intent.action.GET_CONTENT

获得内容

ACTION_DIAL

android.intent.action.GET_CONTENT

显示打电话面板

ACITON_CALL

android.intent.action.DIAL

直接打电话

ACTION_SEND

android.intent.action.SEND

直接发短信

ACTION_SENDTO

android.intent.action.SENDTO

选择发短信

ACTION_ANSWER

android.intent.action.ANSWER

应答电话

ACTION_INSERT

android.intent.action.INSERT

插入数据

ACTION_DELETE

android.intent.action.DELETE

删除数据

ACTION_RUN

android.intent.action.RUN

运行数据

ACTION_SYNC

android.intent.action.SYNC

同步数据

ACTION_PICK_ACTIVITY

android.intent.action.PICK_ACTIVITY

选择Activity

ACTION_SEARCH

android.intent.action.SEARCH

搜索

ACTION_WEB_SEARCH

android.intent.action.WEB_SEARCH

Web搜索

ACTION_FACTORY_TEST

android.intent.action.FACTORY_TEST

工厂测试入口点

四.Intent应用实例代码(来源于网络,仅供参考)

(1).Intent调用拨号程序代码如下:

Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

(2).Intent发送短信或者彩信代码如下:

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); 

(3).Intent通过浏览器打开网页代码如下:

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

(4).发送电子邮件代码如下:

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);

(5).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); 

(6).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); 

(7).Intent拍照代码如下:

// 打开拍照程序
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);

// 取出照片数据
Bundle extras = intent.getExtras();
Bitmap bitmap = (Bitmap) extras.get("data"); 

(8).Intent获取并剪切图片代码如下:

// 获取并剪切图片
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); 

(9).Intent打开Google Market代码如下:

// 打开Google Market直接进入该程序的详细页面 
Uri uri = Uri.parse("market://details?id=" + "com.demo.app"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent); 

(10).Intent安装和卸载程序代码如下:

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

(11).Intent进入设置界面代码如下:

// 进入无线网络设置界面
Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); 
startActivityForResult(intent, 0)      

(12).Intent从一个Activity跳启动另一个Activity代码如下:

Intent intent = new Intent(this, ToActivity.class); // ToActivity是需要启动的Activity类名
startActivity(intent); 

(13).Intent从相册选取照片代码如下:

Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(i, 11); 

(14).Intent打开录音机代码如下:

Intent mi = new Intent(Media.RECORD_SOUND_ACTION); 
startActivity(mi); 

(15).Intent打开联系人列表代码如下:

//方法1            
Intent i = new Intent(); 
i.setAction(Intent.ACTION_GET_CONTENT); 
i.setType("vnd.android.cursor.item/phone"); 
startActivityForResult(i, REQUEST_TEXT); 

//方法2
Uri uri = Uri.parse("content://contacts/people"); 
Intent it = new Intent(Intent.ACTION_PICK, uri); 
startActivityForResult(it, REQUEST_TEXT); 

(16).Intent添加联系人代码如下:

Intent intent = newIntent(Intent.ACTION_INSERT_OR_EDIT);
intent.setType(People.CONTENT_ITEM_TYPE);
intent.putExtra(Contacts.Intents.Insert.NAME, "My Name");
intent.putExtra(Contacts.Intents.Insert.PHONE, "+1234567890");
intent.putExtra(Contacts.Intents.Insert.PHONE_TYPE,Contacts.PhonesColumns.TYPE_MOBILE);
intent.putExtra(Contacts.Intents.Insert.EMAIL, "com@com.com");
intent.putExtra(Contacts.Intents.Insert.EMAIL_TYPE, Contacts.ContactMethodsColumns.TYPE_WORK);
startActivity(intent);

(17).Intent打开另一个应用程序代码如下:

Intent i = new Intent(); 
ComponentName cn = new ComponentName("com.yellowbook.android2",  "com.yellowbook.android2.AndroidSearch"); 
i.setComponent(cn); 
i.setAction("android.intent.action.MAIN"); 
startActivityForResult(i, RESULT_OK); 
昵    称:
验证码:

相关文档:

Android组件
Android基础知识
Android控件
Android实例