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. 使用VTK与Python实现机械臂三维模型可视化

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  2. 链接sql数据库并输出csv文件

    __author__ = 'chunyang.wu' #作者:SelectDB # -*- coding: utf-8 -*- import MySQLdb import os os.environ[ ...

  3. 【转】UIAutomator源码分析之启动和运行

    我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用AccessibilitService APIs来获取窗口界面控件信息已经注入用户行为事件,那么今天开始我们 ...

  4. UAC 实现原理及绕过方法

    目录 0x00 UAC 工作流程 0x01 UAC 实现方法(用户登陆过程) 0x02 UAC 架构 0x03 触发UAC 0x04 UAC 虚拟化 0x05 UAC 逆向分析 1x00 UAC By ...

  5. 阿里云ECS 利用快照创建磁盘实现无损扩容数据盘

    在扩容数据盘时,若遇到磁盘原因导致无法无损的扩容时,可以临时购买一块独立云磁盘来存放数据,然后将数据盘彻底格式化来解决,以下是操作步骤: 1.  首先基于当前数据盘创建一个快照,备份数据,同时可以利用 ...

  6. ios中自定义图层

    图层和VIEW的区别 1:view不具备显示功能,是因view内部有一个图层,才能显示出来 2:图层不具备事件功能,VIEW继承UIRespone具有处理事件功能 3:自定义的图层有一个影式动画,VI ...

  7. Mybatis 如何自动生成bean dao xml 配置文件 generatorconfig.xml (mysql)

    1/自动生成的jar包:mybatis-generator-core-1.3.2.jar   2/generatorconfig.xml文件如: <?xml version="1.0& ...

  8. Ubuntu 如何downgrade降级系统

    大家都熟悉通过网络upgrade升级Linux系统,这里要介绍的是如何downgrade降级系统.背景情况是这样的:我将系统升级到feisty h3之后,发现libvte-0.15.3有个bug,会影 ...

  9. iOS 10 之 网络权限带来的坑

    症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...

  10. Category 的一些事

    来源:伯乐在线 - Tsui YuenHong 链接:http://ios.jobbole.com/90422/ 点击 → 申请加入伯乐在线专栏作者 新增实践部分:偏方 Hook 进某些方法来添加功能 ...