android学习(五) 向另一个应用发送用户 Intent

构建隐含Intent

隐含 Intent 不声明要启动的组件的类名称,而是声明要执行的操作。 该操作指定您要执行的操作,比如查看、编辑、发送或 获取 某项。 Intent 通常还包含与操作关联的数据,比如您要查看的地址或您要发送的电子邮件消息。根据要创建的 Intent,数据可能是 Uri、多种其他数据类型之一,或 Intent 可能根本就不需要数据。


如果数据是Uri,可以使用一个简单的Intent()构造函数来定义操作和数据。
例如,此处显示如何使用指定电话号码的 Uri 数据创建发起电话呼叫的 Intent:

Uri number = Uri.parse("tel:12341234");
Intent callIntent = new Intent(Intent.ACTION_DIAL,number);
startActivity(callIntent);

这里有一些其他 Intent 及其操作和 Uri 数据对:
查看地图:

//基于地址的地图点
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
//基于图的点或纬度/经度.位置= 。
Uri.parse("geo:37.422219,-122.08364?z=14"); // z 是一个缩放参数水平
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

查看网页

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

其他类型的隐含 Intent 需要提供不同数据类型(比如,字符串)的“额外”数据。 您可以使用各种 putExtra() 方法添加一条或多条 extra 数据。

默认情况下,系统基于所包含的 Uri 数据确定 Intent 需要的相应 MIME 类型。如果您未在 Intent 中包含 Uri,您通常应使用 setType() 指定与 Intent 关联的数据的类型。 设置 MIME 类型可进一步指定哪些类型的 Activity 应接收 Intent。
发送带附件的电子邮件

Intent emailIntent = new Intent(Intent.ACTION_SEND);
//这个Intent没有URI所以声明"text/plain"MIME类型
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL,new String[]{"xxx@xxx.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT,"email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT,"Email message test");
emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("content://path/to/email/attachment"))

创建日历事件

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

注:只有API 级别 14 或更高级别支持此日历事件 Intent。
注:尽可能具体地定义您的 Intent 非常重要。例如,如果您想要使用 ACTION_VIEW Intent 显示图像,您应指定 MIME 类型 image/*。这可防止可“查看”数据的其他类型的应用(比如地图应用)被 Intent 触发。


验证是否存在接收Intent的应用

尽管 Android 平台保证某些 Intent 可以分解为内置应用之一(比如,“电话”、“电子邮件”或“日历”应用),您应在调用 Intent 之前始终包含确认步骤
注意:如果您调用了 Intent,但设备上没有可用于处理 Intent 的应用,您的应用将崩溃。
要确认是否存在可响应 Intent 的可用 Activity,请调用 queryIntentActivities() 来获取能够处理您的 Intent 的 Activity 列表。如果返回的 List 不为空,您可以安全地使用该 Intent。例如:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
//如果 isIntentSafe 是 true,则至少有一个应用将响应该 Intent。 如果它是 false,则没有任何应用处理该 Intent。
boolean isIntentSafe = activities.size() > 0;

:在您需要在用户尝试使用它之前停用使用该 Intent 的功能时,您应在 Activity 初次启动时执行此检查。


启动具有Intent的Activity

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// 如果安全就启动activity
if (isIntentSafe) {
    startActivity(mapIntent);
}

显示应用选择器

//标题
String title = getResources().getString(R.string.chooser_title);
//创建应用选择器
Intent chooser = Intent.createChooser(intent, title);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

这将显示一个对话框,其中包含响应传递给 createChooser() 方法的 Intent 的应用列表,并且将提供的文本用作对话框标题。


摘自android developer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值