构建隐含 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 activities = packageManager.queryIntentActivities(mapIntent, 0);
- boolean isIntentSafe = activities.size() > 0; // 如果安全就启动activityif (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 的应用列表,并且将提供的文本用作对话框标题。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/04-08/20140132.html