组件名称 | 方法名称 |
Activity | startActvity( ) startActivity( ) |
Service | startService( ) bindService( ) |
Broadcasts | sendBroadcasts( ) sendOrderedBroadcasts( ) sendStickyBroadcasts( ) |
<activity android:name=".TargetActivity"> <intent-filter> <action android:name="com.scott.intent.action.TARGET"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>TargetActivity在其<intent-filter>中声明了<action>,即目标action,如果我们需要做一个跳转的动作,就需要在Intent中指定目标的action,如下:
public void gotoTargetActivity(View view) { Intent intent = new Intent("com.scott.intent.action.TARGET"); startActivity(intent); } 当我们为Intent指定相应的action,然后调用startActivity方法后,系统会根据action跳转到对应的Activity。public static final String ACTION_MAIN = "android.intent.action.MAIN"; public static final String ACTION_VIEW = "android.intent.action.VIEW"; public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH"; public static final String ACTION_CALL = "android.intent.action.CALL";每一个action都有其特定的用途。
/** * 打开指定网页 * @param view */ public void invokeWebBrowser(View view) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com.hk")); startActivity(intent); } /** * 进行关键字搜索 * @param view */ public void invokeWebSearch(View view) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, "android"); //关键字 startActivity(intent); } 上面两种方法分别是启动浏览器并打开指定网页、进行关键字搜索,分别对应的action是Intent.ACTION_VIEW和 Intent.ACTION_WEB_SEARCH,前者需指定相应的网页地址,后者需指定关键字信息,对于关键字搜索来说,浏览器会按照自己设置的默认 的搜索引擎进行搜索。public void call(View view) { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:")); startActivity(intent); } 那么我们如何知道目标是否接受这种前缀呢?这就需要看一下目标中<data/>元素的匹配规则了。<activity android:name=".TargetActivity"> <intent-filter> <action android:name="com.scott.intent.action.TARGET"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="scott" android:host="com.scott.intent.data" android:port="" android:path="/target"/> </intent-filter> </activity>这个时候如果只指定action就不够了,我们需要为其设置data值,如下:
| 常量 | 解释 |
| CATEGORY_DEFAULT | 默认的category |
| CATEGORY_BROWSABLE | 指定了此category后,在网页上点击图片或链接时,系统会考虑将此目标Activity列入可选列表,供用户选择以打开图片或链接。 |
| CATEGORY_GADGET | The activity can be embedded inside of another activity that hosts gadgets. |
| CATEGORY_HOME | The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed. |
| CATEGORY_LAUNCHER | The activity can be the initial activity of a task and is listed in the top-level application launcher. |
| CATEGORY_PREFERENCE | 表示该目标Activity是一个首选项界面; |
public void gotoTargetActivity(View view) { Intent intent = new Intent("com.scott.intent.action.TARGET"); intent.setData(Uri.parse("scott://com.scott.intent.data:/target")); startActivity(intent); } 此时,url中的每个部分和TargetActivity配置信息中全部一致才能跳转成功,否则就被系统拒绝。public void gotoTargetActivity(View view) { Intent intent = new Intent("com.scott.intent.action.TARGET"); Bundle bundle = new Bundle(); bundle.putInt("id", ); bundle.putString("name", "scott"); intent.putExtras(bundle); startActivity(intent); }需要注意的是,在使用putExtras方法设置Bundle对象之后,系统进行的不是引用操作,而是复制操作,所以如果设置完之后再更改bundle实 例中的数据,将不会影响Intent内部的附加信息。那我们如何获取设置在Intent中的附加信息呢?与之对应的是,我们要从Intent中获取到 Bundle实例,然后再从中取出对应的键值信息:Bundle bundle = intent.getExtras(); int id = bundle.getInt("id"); String name = bundle.getString("name");当然我们也可以使用Intent的getIntExtra和getStringExtra方法获取,其数据源都是Intent中的Bundle类型的实例对象。
<category android:name="android.intent.category.LAUNCHER" />代表该目标Activity是该应用所在task中的初始Activity并且出现在系统launcher的应用列表中。
<?xml version="." encoding="utf-"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="测试Intent Category"/><Buttonandroid:id="@+id/Button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="转到Home界面"/></LinearLayout>strings.xml:
<?xml version="." encoding="utf-"?><resources><string name="hello">Hello World, MainActivity!</string><string name="app_name">IntentCategoryDemo</string></resources>MainActivity.java:
package com.android.category.activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Button btn;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btn = (Button)findViewById(R.id.Button);btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent();intent.setAction(Intent.ACTION_MAIN);// 添加Action属性 intent.addCategory(Intent.CATEGORY_HOME);// 添加Category属性 startActivity(intent);// 启动Activity }});}} 效果图如下:
Home:

4.type:要执行动作的目标Activity所能处理的MIME数据类型
例如:一个可以处理图片的目标Activity在其声明中包含这样的mimeType:
<data android:mimeType="image/*" />在使用Intent进行匹配时,我们可以使用setType(String type)或者setDataAndType(Uri data, String type)来设置mimeType。
intent.setComponent(new ComponentName(getApplicationContext(), TargetActivity.class));intent.setComponent(new ComponentName(getApplicationContext(), "com.scott.intent.TargetActivity"));intent.setComponent(new ComponentName("com.scott.other", "com.scott.other.TargetActivity"));其中,前两种是用于匹配同一包内的目标,第三种是用于匹配其他包内的目标。
// 给移动客服拨打电话 Uri uri = Uri.parse("tel:"); Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent);2.发送短信或彩信
// 给发送内容为“Hello”的短信 Uri uri = Uri.parse("smsto:"); 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/"); intent.putExtra(Intent.EXTRA_STREAM, uri); intent.setType("image/png"); startActivity(intent);3.通过浏览器打开网页
// 打开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 = {"@abc.com", "@abc.com"}; // 收件人 String[] ccs = {"@abc.com", "@abc.com"}; // 抄送 String[] bccs = {"@abc.com", "@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/rfc"); startActivity(intent); 5.显示地图与路径规划// 打开Google地图中国北京位置(北纬.,东经.) Uri uri = Uri.parse("geo:.,."); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);// 路径规划:从北京某地(北纬.,东经.)到上海某地(北纬.,东经.) Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=. .&daddr=. ."); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);6. 播放多媒体
Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:///sdcard/foo.mp"); intent.setDataAndType(uri, "audio/mp"); startActivity(intent); Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, ""); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);7. 拍照
// 打开拍照程序 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, );// 取出照片数据 Bundle extras = intent.getExtras(); Bitmap bitmap = (Bitmap) extras.get("data");8.获取并剪切图片
// 获取并剪切图片 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop", "true"); // 开启剪切 intent.putExtra("aspectX", ); // 剪切的宽高比为: intent.putExtra("aspectY", ); intent.putExtra("outputX", ); // 保存图片的宽和高 intent.putExtra("outputY", ); intent.putExtra("output", Uri.fromFile(new File("/mnt/sdcard/temp"))); // 保存路径 intent.putExtra("outputFormat", "JPEG");// 返回格式 startActivityForResult(intent, );// 剪切特定图片 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", ); // 剪切的宽高比为: intent.putExtra("outputY", ); intent.putExtra("aspectX", ); // 保存图片的宽和高 intent.putExtra("aspectY", ); intent.putExtra("scale", true); intent.putExtra("noFaceDetection", true); intent.putExtra("output", Uri.parse("file:///mnt/sdcard/temp")); startActivityForResult(intent, );9. 打开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.安装和卸载程序
Uri uri = Uri.fromParts("package", "com.demo.app", null); Intent intent = new Intent(Intent.ACTION_DELETE, uri); startActivity(intent);11. 进入设置界面
// 进入无线网络设置界面(其它可以举一反三) Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); startActivityForResult(intent, );