隐式 Intent

本节目录:

  1. 使用隐式 Intent
  2. 隐式 Intent 的组成
    • 执行操作
    • 数据的位置
    • 涉及的数据类型
    • 可选类别
  3. 一些实例

最近学习《Android 权威编著》,这几天学的总结一下,加深印象,也是方便以后忘记了,能快速找到相关内容,本节主要是关于 隐式 Intent 的使用

使用隐式 Intent

隐式 Intent 区别与显示 Intent 的主要区别在于,在实现 Intent 通信我们不需要想显示 Intent 提供以及编写指定具体的 activity,只需要告诉操作系统我们想要做什么,通过系统内置的属性就可以简单实现我们想要的。

隐式 Intent 的组成

执行操作

通常 Intent 类中的常量来表示。

  • Intent.ACTION_VIEW 查看某个 URL
  • Intent.ACTION_SEND 发送邮件
  • Intent.ACTION_DITL 拨号界面等待拨号
  • Intent.ACTION_CALL 拨打电话

数据的位置

  1. 设备外的资源使用 URL
  2. 指向文件的 URI
  3. 指向 ContentProvider 中的某个内容 URI (content URI)

涉及的数据类型

MIME 数据类型,如 text/html , audio/mpeg3.如果一个 intent 包含数据位置,那么通常可以从中推测出数据的类型

关于 MIME

可选类别

如果操作用于描述具体要做什么,那么通常用来描述我们是何时、何地或者如何使用某个 activity 的。

  1. 通过简单的 Intent
  2. 通过配置文件的 intent 过滤器

一些实例

  • 打开短信,发送消息
1
2
3
4
5
6
7
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
/*添加正文内容*/
i.putExtra(Intent.EXTRA_TEXT, "TEXT");
i.putExtra(Intent.EXTRA_SUBJECT, "SUBJECT");
i = Intent.createChooser(i, "选择你想使用的应用");
startActivity(i);

使用 ShareCompat 类创建发送消息

1
2
3
4
5
6
ShareCompat.IntentBuilder intentBuilder = ShareCompat.IntentBuilder.from(getActivity());
intentBuilder.setType("text/plain");
intentBuilder.setText("text");
intentBuilder.setSubject("what");
intentBuilder.setChooserTitle("select");
intentBuilder.startChooser();

  • 打开联系人,选择联系人
1
2
Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(pickContact, REQUEST_CODE);

这需要处理返回的 Intent ,因为系统会把联系人数据发送个 Intent,其中包含了临时的权限。onActivityResult方法中一下注释前是通过 查询名称,注释后查询电话号,并拨打电话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
f (requestCode == 1 && data != null) {
/*创建一个Uri 数据地址*/
Uri contactUri = data.getData();
/*创建查询语句*/
String[] queryFields = new String[]{
// ContactsContract.Contacts.DISPLAY_NAME
ContactsContract.Contacts._ID
};
/*查询联系人数据库,并返回一个 cursor*/
Cursor c = getActivity().getContentResolver().query(contactUri, queryFields, null, null, null);
try {
c.moveToFirst();
/*判断返回结果是否为0 表示没有数据*/
if (c.getCount() == 0) {
return;
}
/*String suspect=c.getString(0);
mCrime.setPeopleName(suspect);
mSuspect.setText(suspect);*/
Uri number = Uri.parse("tel:" + c.getString(0));
Intent i = new Intent(Intent.ACTION_DIAL, number);
startActivity(i);
} finally {
c.close();
}
  • 打开相机
1
2
Intent captureImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(captureImage, 2);

因为 Intent 打开应用两种情况,一种是很多应用支持,可以使用选择器。一种是没有内置的应用,这种情况会让应用崩溃,可以通过 packageManager 自检,如果没有就,禁用按钮

1
2
3
4
PackageManager packageManager = getActivity().getPackageManager();
if (packageManager.resolveActivity(pickContact, PackageManager.MATCH_DEFAULT_ONLY) == null) {
mSuspect.setEnabled(false);
}
(*^▽^*)