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

原文地址: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);

当你的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);

浏览一个Web页面:

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

其它的隐式意图要求附加数据,附加数据提供了不同的数据类型,比如一个字符串,你可以各种的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

创建一个日历事件:

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

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;

如果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);

这里有个完整的例子来展示如何创建一个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);
}

显示一个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);
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源开放 | 图数据交互可视化分析框架 InteractiveGraph v0.3 版本发布

图数据交互可视化分析框架 InteractiveGraph 日前发布 v0.3 版本&#xff0c;下载地址&#xff1a;https://github.com/grapheco/InteractiveGraph/releases/tag/0.3.1图数据模型具有对实体关系的表达能力强、属性 及结构可扩展性好、关联查询高效等优势。在对海量 的多元异构信…

LeetCode 589. N叉树的前序遍历(前序遍历)

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 2. 解题 2.1 递归 class Solution { public:vector<int> preorder(Node* root) {vector<int> ans;preRec(root,ans);return ans;}void preRec(Node* root, vector<int> &ans) {if(root NULL)return;ans…

打脸!一个线性变换就能媲美“最强句子embedding”?

文 | 苏剑林&#xff08;追一科技&#xff09;编 | 小轶小编&#xff1a;前几周小屋刚推完《还在用[CLS]&#xff1f;从BERT得到最强句子Embedding的打开方式&#xff01;》&#xff0c;苏神就来打脸了_(:з」∠)_BERT-flow来自论文《On the Sentence Embeddings from Pre-trai…

AI Challenger 2018:细粒度用户评论情感分析冠军思路总结

2018年8月-12月&#xff0c;由美团点评、创新工场、搜狗、美图联合主办的“AI Challenger 2018全球AI挑战赛”历经三个多月的激烈角逐&#xff0c;冠军团队从来自全球81个国家、1000多所大学和公司的过万支参赛团队中脱颖而出。其中“后厂村静静”团队-由毕业于北京大学的程惠阁…

论文浅尝 | 融入知识的弱监督预训练语言模型

论文笔记整理&#xff1a;叶群&#xff0c;浙江大学计算机学院&#xff0c;知识图谱、NLP方向。会议&#xff1a;ICLR 2020链接&#xff1a;https://arxiv.org/pdf/1912.09637.pdf Abstract预训练语言模型不仅在传统的语言学任务上取得了很好的表现&#xff0c;在一些涉及到背景…

2021 年 1 月程序员薪资出炉,持续上涨!你过平均线了吗?

瑟瑟发抖&#xff01;程序员薪资报告又来了。2021 年 1 月的薪资报告一定能给你个大惊喜&#xff01;程序员薪资扶摇直上。&#xff08;2021年1月程序员收入情况&#xff09;1 月全国程序员平均工资 14915 元&#xff0c;工资中位数 12500 元&#xff0c;其中 96% 的人工资介于…

LeetCode 590. N叉树的后序遍历(后序遍历)

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 2. 解题 2.1 递归 class Solution { public:vector<int> postorder(Node* root) {vector<int> ans;postRec(root, ans);return ans;}void postRec(Node* root, vector<int> &ans){if (root NULL)return…

人物志 | MIT 科技创新“远见者”:美团 NLP 负责人王仲远

2019 年 1 月 21 日&#xff0c;《麻省理工科技评论》发布了 2018 年“35 岁以下科技创新 35 人”&#xff08;35 Innovators Under 35&#xff09;中国榜单&#xff0c;美团点评AI平台部 NLP 中心负责人、点评搜索智能中心负责人王仲远获评为“远见者”。 Innovators Under 35…

论文浅尝 | GraphSAINT—基于图采样的归纳学习方法

论文笔记整理&#xff1a;杨海宏&#xff0c;浙江大学博士生&#xff0c;研究方向为开放世界下的多语言知识问答。1. 简介受显存的因素限制&#xff0c;应用图神经网络于大规模图学习任务上面临“邻居爆炸&#xff08;Neighbor Explosion&#xff09;”问题&#xff0c;导致网络…

LeetCode 105. 已知前序中序 求二叉树

文章目录1. 题目2. 解题1. 题目 类似POJ 2255 Tree Recovery 2. 解题 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {unordered_map<int,int> m;//哈希表for(int i 0; i < inorder.size(); i) {…

李在福羽毛球教学

2020年11月27日更 工作的业余之时一定要记得好好健身哦&#xff0c;争取做个健康小达人很行动上的小巨人。不困于时间、不困于地点、不困于等等。没有借口哦&#xff0c;投资自己的身体也是未来很重要的一部分噶。 1 握拍&#xff1a;大拇指和四个手指头握紧&#xff0c;可以更…

不讲武德,只用标签名就能做文本分类

文 | 谁动了我的炼丹炉编 | 兔子酱今天给大家介绍一篇微软研究院在EMNLP2020上发表的论文&#xff0c;主题是弱监督文本分类。看到标题的你可能会和我刚开始一样震惊&#xff0c;只是知道标签名怎么给文本分类呢&#xff1f;是的&#xff0c;虽然听起来不可思议&#xff0c;但看…

Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP

原文地址&#xff1a;http://android.xsoftlab.net/training/building-content-sharing.html 引言 Android应用程序有一项伟大的事情就是它们有可以与其它应用程序交流及整合。为什么不重新使用已经存在于其它APP中的非核心功能呢&#xff1f; 这节课覆盖了一些共同的方式&a…

美团点评技术年货:一本覆盖各技术领域、1200+页的电子书

春节已近&#xff0c;年味渐浓。 又到了我们献上技术年货的时候。 不久前&#xff0c;我们已经给大家分享了技术沙龙大套餐&#xff0c;汇集了过去一年我们线上线下技术沙龙99位讲师&#xff0c;85个演讲&#xff0c;70小时分享。 今天出场的&#xff0c;同样重磅——技术博客2…

论文浅尝 | 基于文本关联的知识图谱的无监督嵌入增强

来源&#xff1a;IJCAI2019论文链接&#xff1a; https://www.ijcai.org/proceedings/2019/0725.pdf概述知识图谱嵌入是从多关系数据中提取数据的工具&#xff0c;最近的嵌入模型对从现有数据库中推断新事实具有很高的效率。然而&#xff0c;这种精确结构的数据通常在数量和范围…

ICLR2021 Oral |9行代码提高少样本学习泛化能力

文 | 杨朔知乎本文已获作者授权&#xff0c;禁止二次转载介绍一篇我们刚刚发表在ICLR2021 Oral上的一篇少样本学习工作&#xff0c;简单有效。题目&#xff1a;Free Lunch for Few-shot Learning: Distribution Calibration链接&#xff1a;https://openreview.net/forum?idJW…

LeetCode 106. 已知中序后序 求二叉树

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 类似题目LeetCode 105. 已知前序&中序 求二叉树 2. 解题 2.1 递归 递归法&#xff0c;后序最后一个是根节点 class Solution { public:TreeNode* buildTree(vector<int>& inorder, vector<int>& p…

React Native工程中TSLint静态检查工具的探索之路

背景 建立的代码规范没人遵守&#xff0c;项目中遍地风格迥异的代码&#xff0c;你会不会抓狂&#xff1f; 通过测试用例的程序还会出现Bug&#xff0c;而原因仅仅是自己犯下的低级错误&#xff0c;你会不会抓狂&#xff1f; 某种代码写法存在问题导致崩溃时&#xff0c;只能全…

做一个好的搜索引擎有多难

文&#xff5c;见鹿知乎本文已获作者授权&#xff0c;禁止二次转载前言搜索引擎是个极其复杂的系统工程&#xff0c;搜索引擎上并不会大力出奇迹&#xff0c;需要一点点打磨。在搜索引擎上&#xff0c;q-u相关性计算是基础&#xff0c;但仍需要考虑其他很多因素&#xff0c;其中…

Android官方开发文档Training系列课程中文版:分享简单数据之添加简单的分享行为

原文地址&#xff1a;http://android.xsoftlab.net/training/sharing/shareaction.html 从Android4.0开始&#xff0c;使用ActionProvider可以更方便的在ActionBar上实现一个有效的、用户友好的分享按钮。一个ActionProvider一旦依附到了ActionBar的菜单条目上&#xff0c;它会…