1. 前言
Intent主要用于应用程序内部的activity, service和broadcast receiver之间的交互。
2. Intent的属性
action属性,用来表现意图的行动
一个Intent Filter可以包含多个action,表示该activity能接受的动作。启动Activity的action值为 android.intent.action.MAIN。
category属性,用来表现动作的类别
一个Intent Filter可以包含多个category,如果没有指定category,必须使用默认的 android.intent.category.DEFAULT。
启动Activity的category值为 android.intent.category.LAUNCHER。
data属性,是个Uri对象,用来表示动作要操纵的数据
系统内置的几个Data属性常量:
- tel,号码数据格式,后跟电话号码。
- mailto,邮件数据格式,后跟邮件收件人地址。
- smsto,短息数据格式,后跟短信接收号码。
- content,内容数据格式,后跟需要读取的内容。
- file,文件数据格式,后跟文件路径。
type属性,用来对于data范例的描写。
type属性时mime类型,常见type类型有:
- text/html,网页
- text/plain,普通文本
- image/*,图片文件
- video/*,视频文件
- audio/*,音频文件
- application/vnd.android.package-archive,安卓Apk
3. Intent调用
在AndroidManifest.xml文件中定义一个新的Activity,自定义action为 com.blog.demo.action.intent。必须指定category,如果没有使用默认category。
<activity
android:name=".IntentSampleActivity">
<intent-filter>
<action android:name="com.blog.demo.action.intent" />
<action android:name="com.blog.demo.action.sample" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
显式Intent调用直接指定组件。
startActivity(new Intent(this, IntentSampleActivity.class));
隐式Intent调用会在配置文件中查找匹配的组件。Activity的Category中包含一个默认的Category,android.intent.category.DEFAULT。
startActivity(new Intent("com.blog.demo.action.intent"));
如果隐式Intent调用 com.blog.demo.action.sample,匹配到多个组件,会弹出一个选择弹窗。
<activity android:name=".IntentActivity">
<intent-filter>
<action android:name="com.blog.demo.action.sample" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.blog.demo.MY_CATREORY" />
</intent-filter>
</activity>
可调用Intent.createChooser
方法打开多个组件进行选择。
Intent targetIntent = new Intent("com.blog.demo.action.sample");
Intent intent = Intent.createChooser(targetIntent, "选择");
startActivity(targetIntent);
可以指定多个category来匹配,
Intent intent = new Intent("com.blog.demo.action.intent");
intent.addCategory("com.blog.demo.MY_CATREORY");
startActivity(intent);
4. Intent值传递
调用Intent.putExtra()
方法传递值,调用getIntent().getXXXExtra()
方法获取。
5. 启动Activity的方式
启动方式,一种是直接使用startActivity()
,另外一种就是使用startActivityForResult()
。
startActivityForResult()
的主要作用就是可以回传数据。requestCode是一个常量,用于区分回调的来源。
startActivityForResult(Intent intent, int requestCode)
onActivityResult()
的主要作用就是来处理回调数据,其中requestCode是请求时的参数,resultCode和data是新Activity中返回的值。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
在新Activity中使用setResult()
来返回数据,如果没有调用setResult方法,resultCode返回RESULT_CANCELED
,data为空。
setResult(int resultCode)
setResult(int resultCode, Intent data)
6. 常用Intent
返回Home界面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
进入拨号界面,显示号码10086
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
拨打电话,需要添加权限android.permission.CALL_PHONE
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
打开网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_PHOTO);
// onActivityResult中调用
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
获取图片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE_PICTURE);
// onActivityResult中调用
Uri uri = data.getData();
Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
安装apk
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.fromFile(new File("xxx.apk"));
intent.setDataAndType(data, "application/vnd.android.package-archive");
startActivity(intent);