6 与其它应用程序交互

一个Android应用程序通常有多个活动。每一项活动都将显示一个用户界面,允许用户执行某种特定任务(如查看地图或者照片)。为了把用户从一个活动带到另一个,你的应用必须使用Intent定义您的应用程序做某些事情的“意图”。当你用某个方法,如 startActivity(),给系统传递一个 图,系统就使用意图来识别并启动相应的应用程序组件。使用意图,甚至可以让你的应用程序启动在另一个的应用程序中包含的活动。

一个意图可以是显式的,用以启动一个特定的组件(一个特定的活动实例),或者是隐式的,用以启动可以处理预期动作的任何组件(如“拍摄照片”)。

这节课,告诉你如何使用意向与其他的应用程序执行一些基本的交互,如启动另一个应用程序,从该应用程序接收结果,以及使您的应用程序能够响应来自其他应用程序的意图。

课程


把用户带到另一个应用程序

展示如何创建隐式的意图,启动其他应用程序,来执行一个动作。

从活动获取结果

展示如何启动另一个活动,并从活动中接收结果。

允许其他应用程序来启动你的活动

展示了如何通过定义意图过滤器声明您的应用程序接受的隐式意图,使你的应用程序中的活动对其他应用程序开放使用。

6.1把用户带到另一个应用程序


Android的最重要的特点之一是应用程序把用户带到另一个应用程序的能力,这种能力基于它想执行的“操作”。例如,如果您的应用程序有一个企业的地址,而你想在地图上显示该地址,你不必在您的应用程序中建立一个活动来显示地图。相反,你可以使用意图创建一个请求来查看该地址。Android系统接着就会启动一个能够在地图上显示地址的应用程序。

正如在第一节课“建立你的第一个应用程序”中所说的,你必须使用意图,在自己的应用程序的活动之间进行导航。你通常是使用一个显式意图,它定义了你想要启动的组件的确切的类名。然而,当你想有一个单独的应用程序执行一个操作,如“查看地图”,你必须使用一个隐式意图

这节课告诉你如何为一个特定的操作创建一个隐式意图,以及如何用它来启动另一个应用程序中的一个活动来执行该操作。

建立一个隐式意图


隐式意图不声明要启动组件的类名,而是声明要执行的操作。该操动指定你想做的事情,如查看, 编辑发送,或获取某些东西。意图往往还包括与操作相关的数据,如你要查看的地址,或您要发送的邮件信息。根据您要创建的意图,数据可能是一个Uri,其他几种数据类型之一,或意图可能并不需要任何的数据。

如果您的数据是一个Uri,有一个简单的Intent()构造函数,你可以用它来定义操作和数据。

例如,下面是如何创建一个意图使用Uri数据指定电话号码来发起电话呼叫的方法:

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

当您的应用程序通过调用startActivity()唤起这个意图,电话应用程序用给定的电话号码发起呼叫。

这里有一对另外的意图,以及它们的行动和Uri数据对:

·      查看地图:

·      // Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based onlatitude/longitude
// Uri location =Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

·      查看一个网页:

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

其它类型的隐式意图需要“额外的(extra)”数据,这些数据提供了不同的数据类型,如字符串。您可以使用各种putExtra()方法添加一个或多个extra数据。

默认情况下,系统将根据包含的Uri数据决定意图所需要的合适的MIME类型 。如果你的意图不包含Uri,你通常应该使用setType()指定意图的相关数据的类型。设置MIME类型,还能指定哪些类型的活动会收到该意图。

下面是一些更多的添加extra数据来指定所要求的操作的意图,:

·      发送带附件的电子邮件:

  • Intent emailIntent =newIntent(Intent.ACTION_SEND);
    // The intent does not have a URI, so declare the "text/plain" MIME type
    emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
    emailIntent.putExtra(Intent.EXTRA_EMAIL,newString[]{"jon@example.com"});// recipients
    emailIntent.putExtra(Intent.EXTRA_SUBJECT,"Email subject");
    emailIntent.putExtra(Intent.EXTRA_TEXT,"Email message text");
    emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("content://path/to/email/attachment"));
    // You can also attach multiple items by passing an ArrayList of Uris

·      创建一个日历事件:

);
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");

和更高版本中支持。

注:你尽可能具体地定义你的意图是很重要的。例如,如果你想使用ACTION_VIEW意图显示图像,你应该指定MIME类型为 image/*。这可以防止那些能“查看”其他类型的数据的应用程序(例如地图应用程序),被意图触发。

验证有一个应用程序能接收意图


尽管Android平台保证某些意图将由某个内置的应用程序解决(如电话、电子邮件或日历应用程序),你应该总是在调用意图之前包括验证的步骤。

注意:如果你调用一个意图,而设备上没有任何的应用程序可以处理这个意图,你的应用程序将会崩溃。

要想验证是否有一个有效的活动可以响应的意图,可调用queryIntentActivities()得到一个能够处理你的意图的活动列表。如果返回的列表不为空,你可以放心地使用的意图。例如:

;

如果isIntentSafe,那么至少有一个应用程序将响应该意图。如果它为,那么就不会有任何的应用程序来处理这个意图。

注:您的活动第一次启动时你应该执行此检查,以防你需要在用户尝试使用它之前禁用该意图的功能。如果你知道一个特定的应用程序可以处理这个意图,你也可以提供一个链接供用户下载此应用程序(请参阅如何链接您的产品到Google Play)。

用意图启动一个活动



一个以上的应用程序可以处理意图时出现选择对话框时的示例。

所示。如果只有一个活动能处理意图时,系统立即启动它。

startActivity(intent);

下面是一个完整的例子,显示了如何创建一个意图来查看地图,确认存在一个应用程序来处理这个意图,然后启动它:

;
 
// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}

显示一个应用程序选择器



当你使用createChooser()来确保总是向用户显示回应你的意图的应用程序列表时,出现选择对话框的示例。

)。当用户通常希望每次使用相同的应用程序来执行操作时,如打开一个网页时(用户可能只使用一个Web浏览器),或拍摄照片(用户可能更喜欢一个照相机),这是一种不错的做法。然而,如果要执行的动作可以被多个应用程序处理,而用户可能更喜欢每一次用不同的应用程序,如“共享”操作,用户可能有几个应用程序能够共享项目,你应该明确地显示一个选择对话框,强制用户每次选择使用哪款应用执行这个操作(用户不能为操作选择一个默认的应用程序)。

要显示选择器,使用createChooser()创建一个意图,并把它传递给startActivity()。例如:

Intent intent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources forUI text. This says something like "Share this photo with"
String title = getResources().getText(R.string.chooser_title);
// Create and start the chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);

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

跟Google学习Android开发-起始篇-与其它应用程序交互(1)的更多相关文章

  1. 跟Google学习Android开发-起始篇-与其它应用程序交互(2)

    6.2从活动获取结果 启动另一个活动不必是单向的.您也可以启动另一个活动,并接收一个结果回来.为了接收一个结果,调用startActivityForResult()(而不是startActivity( ...

  2. 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)

    说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...

  3. 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)

    4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...

  4. 想学习Android开发

    最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...

  5. android初级应用到高端架构教程------ 完整体系化学习android开发

    系统的学习android开发技术,从应用到底层,再到架构,告别乱糟糟的学习方式,不再是抓不住重点.从上到下贯通,全面学习android开发.让你拥有清晰的思路,一步步学习android开发! 一般而言 ...

  6. Xamarin Android 之起始篇

    序言: 在博客园注册了已经有2年多了,快三年了.从开始学习这一行开始就在博客园注册了这个账号.至今也还没有写过一篇随笔,大多时候都是在园子里头潜水,看大牛写的文章,学习. 写博客不为啥,就是自己对自己 ...

  7. 站在巨人的肩膀上学习Android开发

    我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...

  8. 新人学习Android开发遇到的小问题总结

    1. IDE搭建: 搭建android的IDE时,先注意是什么版本的系统,64/32位系统. 通常使用的是Eclipse for android,Android Studio由于还需要FQ,网速慢,所 ...

  9. 10个学习Android开发的网站推荐

    1. Android Developers 作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会. 2. Android Gui ...

随机推荐

  1. android取得所在位置的经纬度

    android提供了LocationManager来取得位置,用LocationListener来监听位置的变化 先做一些初始化工作: /** latitude and longitude of cu ...

  2. iOS原生App与H5页面交互笔记

    文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...

  3. linux(Centos 6.3)学习笔记

    一.系统分区    1,磁盘分区        使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分.碟片一旦划分成          数个分区,不同类的目录与文件可以存储进不同 ...

  4. Codeforces Round #253 (Div. 2), problem: (B)【字符串匹配】

    简易字符串匹配,题意不难 #include <stdio.h> #include <string.h> #include <math.h> #include < ...

  5. java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

    java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配, ...

  6. Android之Camera控制拍照

    package com.android.xiong.cameratest; import java.io.File; import java.io.FileOutputStream; import j ...

  7. Reverse Words in a String | LeetCode OJ | C++

    我的思路:先读取每一个单词,存放到容器中:读取完毕后,将容器中的单词倒序写入输出中. #include<iostream> #include<string> #include& ...

  8. saltstack:使用教程之一安装及客户端返回写入MySQL

    saltstack使用教程: 1.安装: 需要epel的yum源,没有的话把下面的复制并新建个文件 /etc/yum.repos.d/epel.repo 粘贴即可: [epel] name=Extra ...

  9. gethostbyname()函数说明

    gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件    #include <netdb.h>    #include <sys/socket.h> ...

  10. C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客

    C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客 C++中实现对map按照value值进行排序 2012-03-15 15:32:36 标签:map 职场 休闲 排 ...