Android的一个非常重要的功能是,应用程序基于它要执行的一个“动作”想其它应用程序发送用户的能力。例如,如果你的应用程序要显示一个地图,你没有在你的应用程序中创建显示地图的Activity。相反,你使用一个Intent创建了请求查看地址。Android系统然后启动一个应用,它能在地图上显示地址。

正如在第一课中解释的,Building Your First App,你必须使用intent在你自己应用中的各个Activity之间导航。你通常使用显式意图来做它,它定义了你想要启动的组件的确切类名。然而,当你想要一个分开的应用执行一个动作的时候,例如“查看地图“,你必须使用一个隐式意图。

这个课程向你展示了如何创建一个特殊动作的隐式意图来,并如何使用它来启动一个Activity,它在其它的应用中执行动作。

构建一个隐式意图

——————————————————————————————————————————————————————————————

隐式意图没有声明要启动的组件的类名,但是声明了要指定的动作来代替。这个动作指明了你想要做的事情,例如查看,编辑,或者获取一些东西。意图通常也包含数据相关的动作,例如你想要查看的地址,你想发送的邮件地址。基于你想要创建的Intent,数据可能是一个Uri,其它数据类型之一,或者意图可能不需要数据。

如果你的数据是一个Uri,这里有一个简答的Intent()构造器,你能使用它来定义动作和数据。

例如,这里展示如何创建一个Intent来初始化一个电话呼叫,使用Uri数据来指定电话号码:

  1. Uri number = Uri.parse("tel:5551234");
  2. Intent callIntent = new Intent(Intent.ACTION_DIAL, number); <span style="font-size:11pt; line-height:15px; background-color:transparent; color:windowtext; font-family:宋体,sans-serif"> </span>

当你的应用通过startActivity()方法调用这个Intent的时候,Phone应用程序给这个给予的电话号码启动一个呼叫。

这里是一组其它意图和他们的动作和Uri数据对:

  • 查看地图:

  1. // Map point based on address
  2. Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
  3. // Or map point based on latitude/longitude
  4. // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
  5. Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
  • 查看网页:

  1. Uri webpage = Uri.parse("http://www.android.com");
  2. Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage); <span style="background-color:transparent; color:windowtext; font-family:'Calibri Light',sans-serif; font-size:10pt; line-height:13px"> </span>

其它类型的隐式意图要求提供不同数据类型的”额外“数据,例如一个字符串。你能使用各种各样的putExtra()方法添加一个或者多个额外数据。

默认,系统通过Intent包含的Uri数据来决定要求的正确的MIME类型。如果你在这个Itent中不包含一个Uri,你通常应该使用setType()方法来指定这个意图相关的数据类型。设置MIME类型指定将获取这个意图的Activity的类型。

这里有更多的Intent,添加了额外的数据来指定想要的动作:

  • 发送带有附件的邮件:

  1. Intent emailIntent = new Intent(Intent.ACTION_SEND);
  2. // The intent does not have a URI, so declare the "text/plain" MIME type
  3. emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
  4. emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
  5. emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
  6. emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
  7. emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
  8. // You can also attach multiple items by passing an ArrayList of Uris<span style="font-family:'Calibri Light',sans-serif; font-size:10pt; background-color:transparent; color:windowtext"> </span>
  • 创建一个日历事件:

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

注意:用于日历事件的意图仅仅在API level 14或者更高的版本中被支持。

注意:尽可能具体的定义你的Intent是非常重要的。例如,如果你想使用ACTION_VIEW意图来显示一个图片,你应该指明iamge/* IMIE类型。这阻止了能“查看”其它类型数据(如一个地图应用)的应用程序被这个Intent触发。

核实有获取这个意图的应用

——————————————————————————————————————————————————————————————

尽管Android平台保证某些意图将会被内置的应用解析(如Phone,Email, 或者Calendar应用程序),你应该总是在调用一个意图之前包含一个核实的步骤。

当心:如果你调用一个Intent,并且在设备上没有应用程序可以处理这个Itent,你的应用将会崩溃。

为了核实是否有一个Activity有效响应这个Itent,调用queryItentActivities()方法来获取能处理你的Intent的Activity。如果被返回的列表不是空的,你可以安全的使用这个Intent。例如:

  1. PackageManager packageManager = getPackageManager();
  2. List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
  3. boolean isIntentSafe = activities.size() > 0; <span style="font-size:11pt; line-height:15px; background-color:transparent; color:windowtext; font-family:宋体,sans-serif"> </span>

如果isIntentSafe是ture,那么至少一个应用程序将响应这个Intent。如果它是false,那么没有任何应用程序能处理这个Intent。

注意:你应该执行这个检查,当你的Activity第一次启动

使用Intent启动一个Activity

——————————————————————————————————————————————————————————————

一旦你创建你的Intent,并设置了额外的信息,调用startActivity()方法向系统发送它。如果系统识别超过一个Activity能处理这个intent,,它向用户显示一个对话框,来选择将要使用哪个应用,如图1所示。如果这里仅仅有一个activity能处理这个Intent,系统立刻启动它:

startActivity(intent);

这里是一个完整的例子,它显示了如何创建一个Intent来查看地图,检查存在一个处理这个Intent的应用,然后启动它:

  1. // Build the intent
  2. Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
  3. Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
  4. // Verify it resolves
  5. PackageManager packageManager = getPackageManager();
  6. List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
  7. boolean isIntentSafe = activities.size() > 0;
  8. // Start an activity if it's safe
  9. if (isIntentSafe) {
  10. startActivity(mapIntent);
  11. }

显示一个应用选择器

——————————————————————————————————————————————————————————————

注意到,当你通过传递你的Intent给startActivity()方法启动一个Activity,并且这里有超过一个应用响应这个Intent,用户能选择那个应用默认被使用(通过选择在对话框底部的一个checkbox;查看图1)。当用户通每次想使用相同的应用来执行的时候是非常好的,例如当打开一个网页(用户喜很可能仅仅使用一个浏览器)或者获取一张照片(用户 很可能执行照相机)。然而,如果将要执行的动作可以通过多个应用程序处理,并且用户每次可能执行不同的应用—例如一个“分享”动作,用户可能有多个应用,通过它们用户分享一个选项—你应该明白地显示一个选择器对话框,它强制用户来选择哪个应用被每次被用户这个动作(用户不能为动作选择一个默认的应用程序)。

为了显示这个选择器,创建一个Intent使用createChooser()并且传递给StartActivity()方法。例如:

  1. Intent intent = new Intent(Intent.ACTION_SEND);
  2. ...
  3. // Always use string resources for UI text. This says something like "Share this photo with"
  4. String title = getResources().getText(R.string.chooser_title);
  5. // Create and start the chooser
  6. Intent chooser = Intent.createChooser(intent, title);
  7. startActivity(chooser); <span style="font-size:11pt; line-height:15px; background-color:transparent; color:windowtext; font-family:宋体,sans-serif"> </span>

这显示了一个有一列应用程序的对话框,它们响应传递给createChooser()方法的意图,并使用提供的文本作为对话框的标题。

Android Developers:向其它应用发送用户的更多相关文章

  1. 【Android Developers Training】 107. 认知用户当前的行为

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 28. 将用户带领到另一个应用

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 102. 序言:让你的应用获知地点

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 27. 序言:和其它应用交互

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 41. 向另一台设备发送文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 32. 向其它应用发送简单数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 106. 创建并检测地理围栏

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. 神器phpstorm功能具体解释

    phpstorm包括了webstorm的所有功能,更可以支持php代码. PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,高速导航以及即 ...

  2. java面试第二天

    局部变量:不是声明在类体括号里面的变量 (1)必须要先赋值,后使用,否则通不过编译,局部变量没有默认初始化值 (2)作用范围:定义开始到定义它的代码块结束 (3)同一范围内,不允许2个局部变量命名冲突 ...

  3. Aerospike系列:2:商业版和社区版的比较

    http://www.aerospike.com/products-services

  4. 写一个function,清除字符串前后的空格。(兼容所有浏览器)

    代码: function trim(str) { if (str && typeof str === "string") { return str.replace( ...

  5. stardict dict url

    http ://download.huzheng.org/zh_CN/  tar -xjvf a.tar.bz2 -C /usr/share/stardict/dic 

  6. 一张图弄明确开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的差别

    导读 在开源软件中常常看到各种协议说明.GPL.BSD.MIT.Mozilla.Apache和LGPL. - 这些协议之间的有什么差别 - 怎样选择合适的开源协议 请看下文,特作记录一篇,以供兴许查看 ...

  7. VTK中获取STL模型点的坐标以及对其进行变换

    VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG.OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的 ...

  8. linux-shell脚本高并发对文本url批量下载

    实践出真知 样例 http://xxxx.file.myqcloud.com/yyy/xxxxx/xxxx.jpg #注意xxx,yyy都是马赛克 需求: 1.url条数130万左右,图片都说16kB ...

  9. Docker安装和常用命令

    Docker安装 Docker的安装可以参考 https://docs.docker.com/ 下面的 Get Docker / Docker CE / Linux, 需要关注的主要是CentOS和U ...

  10. Ubuntu16.04编译安装Redis Desktop Manager

    Redis Desktop Manager for OSX&Ubuntu 的安装版是收费的, 如果自己编译则是免费的. 安装过程参考官方提供的文档  http://docs.redisdesk ...