Android官方开发文档Training系列课程中文版:与其它APP交互之将用户带到其它的APP

简介: 原文地址:http://android.xsoftlab.net/training/basics/intents/index.html导言一个Android APP应用通常会有若干个Activity。

原文地址:http://android.xsoftlab.net/training/basics/intents/index.html

导言

一个Android APP应用通常会有若干个Activity。每一个Activity所展示的用户界面用于允许用户执行特定的任务(比如浏览地图或者是拍照)。为了把用户从一个activity带到另一个activity,APP必须使用一个Intent对象定义APP的意图是想要做什么事情,系统会使用这个Intent对象来识别并启动合适的APP组件。使用意图事件允许你的APP启动另一个程序中的Activity。

一个Intent可以明确的启动一个具体的组件(一个具体的Activity实例)或者模糊的启动任何组件,不过这个组件需要有能力处理预期的行为(比如拍照)>

这节课展示了如何使用Intent与其它APP执行一些基础交互,比如启动另一个APP,从另一个APP接收结果,或者使你的APP可以响应其它APP的请求。

将用户带到另一个Activity

Android主要特征之一就是一个APP有能力带领用户到另一个APP。举个例子,如果你的APP有一条商业地址,并且你想在地图上将这个地址展示出来,你不需要不得不在APP内创建一个可以展示地图的Activity。相反,你可以使用Intent创建一个请求,来请求展示这个地址。Android系统然后会启动一个有能力在地图上展示地址的APP。

就像第一节课所描述的,Building Your First App,你必须使用Intent来引导APP中的两个activity。你通常对这样的情况使用显式意图,意图中明确定义了你想启动的组件的类名。然而,当你想要通过其它不知类名的APP执行这个行为的时候,比如查看地图,这时,你就必须使用隐式意图了。

这节课展示了如何对特定的行为创建隐式意图,以及如何使用它来启动另一个APP中可以执行这个行为的Activity。

构建一个隐式意图

隐式意图不会声明将要启动的组件的类名,不过相反的,它会声明要执行的行为。这个行为指明了你将要做的事情,比如查看、编辑、发送或者获取一些东西。Intent经常还会包含一些与行为有关的数据,比如你想浏览的地址,或者你想发送的email消息。依赖于你想创建的intent,这里的数据可能是一个Uri,一种其它的数据类型,或者intent一点数据都不需要。

如果你的数据是一个Uri,这里有一个简单的Intent类的构造方法,你可以使用这个构造行为和数据。

举个例子,这里展示了如何使用Uri创建一个Intent来拨打电话,并且在Uri中指明了电话号码:

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
AI 代码解读

当你的APP通过startActivity()调用了这个intent,电话APP会拨打刚才给定的电话号码。

这里有一些其他意图以及它们的行为和Uri数据对:

查看地图:

/ Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/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);
AI 代码解读

浏览一个Web页面:

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
AI 代码解读

其它的隐式意图要求附加数据,附加数据提供了不同的数据类型,比如一个字符串,你可以各种的putExtra()方法添加一个或者多个额外的数据。

默认情况下,系统确定要求Uri中包含合适的MIME类型,如果没有在intent中包含Uri,你应该使用setType()方法指定与intent关联的数据类型。设置了MIME类型更进一步的指明了哪一种类型的activity应该接收这个intent。

这里有一些添加了附加数据来指定期望行为的intent:

使用附加数据发送email:

Intent emailIntent = new Intent(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, new String[] {"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
AI 代码解读

创建一个日历事件:

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");
AI 代码解读

Note:这里的日历事件仅仅支持API 14及以上的版本

Note:尽可能的明确Intent是非常重要的。举个例子,如果你希望使用ACTION_VIEW意图来展示一张图片,你应该指定MIME类型为’image/*’。这可以预防由intent引起的APP查看其它类型的数据(比如地图APP)。

确认有APP可以接收Intent

尽管Android平台保证intent可以被内置的应用(比如电话、邮件或者日历)解析,但是你还是应该在启动一个intent之前执行验证这一步。

警告:如果你启动了一个intent,但是没有APP可以处理该intent,你的APP就会崩溃。

为了验证系统中有Activity可以响应Intent的请求,需要调用queryIntentActivities()方法来获取有能力处理Intent的activity列表。如果返回的列表不是空的,那么你就可以安全的使用intent了:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
AI 代码解读

如果isIntentSafe的值为true,那么至少有一个APP可以响应intent。如果为false,那么没有任何APP可以处理intent。

Note:当在activity第一次启动的情况下,你应该执行这项检查。如果你知道指定的APP可以处理这个Intent,你也可以提供一个连接以供用户去下载这个APP(有关请看link to your product on Google Play).

使用Intent启动一个Activity

上图中:当多个APP可以处理intent的时候,选择对话框会显示出来。

曾经你创建了Intent,并且设置了附加信息,调用startActivity()将intent发送给系统。如果系统识别了多个activity可以处理这个intent,它会显示一个对话框来让用户选择要使用哪个APP,就像上图所示。如果只有一个activity可以处理,那么系统会立即启动它。

startActivity(intent);
AI 代码解读

这里有个完整的例子来展示如何创建一个intent来浏览地图,验证存在可以处理intent的APP,然后启动它:

// 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);
}
AI 代码解读

显示一个APP选择器

上图中:一个选择器对话框。

注意当你在启动Activity的时候有多个APP可以响应Intent,那么用户可以选择默认情况下要启动哪个APP。这非常好,在每一次要执行相同动作的时候,比如打开一个Web页面(用户可能只喜欢一个web浏览器)或者拍照。

然而,在这种情况下,可能用户需要每次都需要选择不同的APP,比如分享这个行为,这种情况下用户可能要分享到多个APP上,你应该明确显示一个选择器对话框,这个选择器对话框会每次出现在用户选择的时候(这种情况下没有默认选择选项)。

如果要显示选择器对话框,需要使用createChooser()方法创建一个Intent对象,然后传给startActivity()

Intent intent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, title);
// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}
AI 代码解读

这样就会显示一个选择器对话框了,这个对话框会像上图显示的那样,将符合条件的APP显示出来,并且支持自定义的标题文本。

目录
打赏
0
0
0
0
1
分享
相关文章
|
1月前
|
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
108 15
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
在当今移动社交领域,一对一视频和语音通话功能已成为用户期待的基础配置。从熟人社交到陌生人交友,从专业咨询到情感陪伴,实时音视频互动能力直接决定了社交App的用户留存和市场竞争力。山东布谷科技将深入探讨一对一直播源码开发高质量一对一视频和语音通话功能的关键要素和技术实现方案。
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
【一步步开发AI运动APP】四、使用相机组件抽帧
本文介绍了如何使用`ai-camera`组件开发AI运动APP,助力开发者深耕AI运动领域。`ai-camera`是专为AI运动场景设计的相机组件,支持多平台,提供更强的抽帧处理能力和API。文章详细讲解了获取相机上下文、执行抽帧操作以及将帧保存到相册的功能实现,并附有代码示例。无论是AI运动APP还是其他场景,该组件都能满足预览、拍照、抽帧等需求。下篇将聚焦人体识别检测,敬请期待!
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
【一步步开发AI运动APP】六、运动计时计数能调用
本文章介绍了如何通过【一步步开发AI运动APP】系列博文,利用uniAPP插件开发高性能的AI运动应用。文中详细说明了创建运动分析器、进行运动分析、监听计数变化以及停止/重置分析等功能实现步骤。插件内置多种常见运动(如跳绳、俯卧撑等),支持自定义扩展,满足健身、体测等场景需求。示例代码展示了人体检测、运动计时计数及UI更新的完整流程,帮助开发者快速上手并深耕AI运动领域。
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
【一步步开发AI运动APP】五、人体检测能力调用
本文介绍如何开发性能更强、体验更优的AI运动APP,涵盖人体检测、实例创建、检测识别、骨骼图绘制及完整代码实现。通过API `createHumanDetector`,可灵活配置高性能、高精度或多人检测模式,省去模型部署麻烦。检测结果可通过`yz-pose-grapher`组件高效渲染骨骼图。最后提醒使用完毕需调用`destroy()`释放资源,下篇将聚焦运动检测分析,敬请期待!
【一步步开发AI运动APP】二、跨平台APP AI运动识别方案介绍
本系列博文旨在帮助开发者从【AI运动小程序】迈向性能更优的【AI运动APP】开发。通过「云智AI运动识别」uni-app版插件,提供本地原生极速识别、精准姿态检测及运动计时计数功能,支持健身系统、线上赛事、学生体测、康复锻炼等多场景应用。插件无需云端依赖,一次付费永久使用,成本低且扩展性强。同时兼容uni-app与uni-app x框架,适合不同技术背景的开发者快速上手,助力抢占AI辅助运动市场。下篇将介绍插件引入,敬请期待!
【一步步开发AI运动APP】一、写在最前
本文介绍新系列【一步步开发AI运动APP】,旨在帮助开发者突破小程序限制,打造性能更强、体验更佳的AI运动APP。相比小程序,APP可充分利用CPU/GPU算力,实现高精度人体检测、多人检测等复杂功能。本系列基于跨平台框架`uni`及扩展插件`uni AI运动识别插件`,适合有小程序开发经验的开发者。内容涵盖抽帧、人体识别、运动分析、姿态交互等,逐步进阶实现完整AI运动APP,并支持多手机平台发布。
直播App程序源码开发前期功能调研:运营角度思考如何有利于推广运营获利
在直播App程序源码开发的前期,功能调研至关重要。除了技术实现的可行性,更需要从运营角度出发,思考哪些功能能够助力推广运营,最终实现获利。山东布谷科技从运营角度,对直播App功能进行调研分析

热门文章

最新文章