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

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

 

·      创建一个日历事件

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和更高版本中支持。

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


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


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

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

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


PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;


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

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


用意图启动一个活动



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


一旦你创建了你的意图,并设置了extra信息,调用startActivity()将它发送到系统。如果系统识别到多个活动可以处理这个意图,它会显示一个对话框供用户选择使用哪个应用程序,如图1所示。如果只有一个活动能处理意图时,系统立即启动它。

startActivity(intent);

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


// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;
 
// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}


显示一个应用程序选择器



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

请注意,当你传递你的意图startActivity()启动一个活动时有一个以上的应用程序响应你的意图,用户可以选择默认使用的应用程序(通过选择对话框底部的一个复选框;参见图1)。当用户通常希望每次使用相同的应用程序来执行操作时,如打开一个网页时(用户可能只使用一个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()方法的意图的应用程序列表,并使用提供的文本作为对话框的标题。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值