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()方法的意图的应用程序列表,并使用提供的文本作为对话框的标题。

最新文章

  1. 基于C/S架构的3D对战网络游戏C++框架 _【不定期更新通知】
  2. TestLink学习二:Windows搭建TestLink环境
  3. iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
  4. 递归---n皇后
  5. HTML5 Canvas画数字时钟
  6. js相对定位
  7. 使用mex进行混合编程的一些注意事项
  8. <Win32_17>集音频和视频播放功能于一身的简易播放器
  9. MySQL SQL分析(SQL profile)
  10. CF219C hoosing Capital for Treeland
  11. python爬虫入门(八)Scrapy框架之CrawlSpider类
  12. 【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源
  13. java_反射
  14. JAVA进阶9
  15. 文件下载后台报错IllegalStateException: getOutputStream() has already been called
  16. 斯坦福大学公开课机器学习:advice for applying machine learning | diagnosing bias vs. variance(机器学习:诊断偏差和方差问题)
  17. 轻量级MVVM框架 Stylet
  18. 【微服务系列】Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
  19. 【科技】KD-tree随想
  20. 基于docker 搭建Elasticsearch6.2.4(centos)

热门文章

  1. jQuery遍历table
  2. iOS NSRuntime机制
  3. javascript学习(10)——[知识储备]链式调用
  4. Android的回调
  5. DW8051调试终结
  6. 基于visual Studio2013解决算法导论之029二叉搜索树
  7. 关于 Oracle外键列上是否需要索引问题?
  8. poi操作officePOI操作excel中的数据格式(日期类型)
  9. Android内存泄漏简介
  10. 点击datalist中Button按钮出现“回发或回调参数无效......”