挖掘隐式启动Activity可能存在的坑

今日科技快讯

很早之前,谷歌母公司Alphabet的董事长施密特就曾经表示,在中国市场,谷歌需要寻找到一个商业伙伴来开展自身的一些业务。而近日有消息传出,谷歌和网易正在进行合作磋商,很可能是成立合资公司,在国内推出针对中国市场的Google Play应用商店。但是双方是否会达成合作尚未可知。

作者简介

正所谓实践出真知,本篇来自 杨道龙 的投稿,亲自试验了如何隐式启动Activity。希望能对大家有所帮助。

杨道龙 的博客地址:

http://blog.csdn.net/qq_32059827

正文

有些人可能会说了,隐式启动活动不是很简单吗?这有什么不理解的?话先别说的这么早,对于隐式启动,还是具有很大的坑要爬的,当然,您如果是一个资深开发者就另当别论了。

本篇文章,我们从最简单的开始,一步步引入,相信这样的方式,读起来也会轻松一些。

我们平时启动一个活动,会通过两种方式。1、显示启动2、隐式启动

首先,我们来看两个很简单的小案例(实现打电话)

我们在布局文件提供一个 TextView 用于提示输入电话号码,在 EditText 里面输入号码,点击按钮的同时,获取到用户输入的号码,并且启动打电话功能。

主活动代码很简单,MainActivity:

运行后如下:

这个简直太简单了,估计代码都能烂肚子里了。

嗯,的确很简单,那就紧跟脚步,我们继续看一个简单的自定义启动活动的代码。

自定义Activity,并隐式方式启动

我们都知道,如果要想自定义隐式启动别的 activity,需要给该 Activity 添加“意图过滤器”<intent-filter>。

通过在 <activity> 标签下配置 <intent-filter> 的内容,可以指定当前活动能够响应的 action
和 category,打开 AndroidManifest.xml,添加如下代码:

在 <action> 标签中我们指明了当前活动可以响应 com.itydl 这个 action,我们可以随便写里面的内容,它的加入表示给我们的 Activity 添加一个动作,只有带动作的 Activity 才能被隐式启动。

而 <category> 标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的 Intent 中还可能带有的 category。意图中设置的 action 必须跟 "com.itydl" 是完全匹配的,只有 <action> 和 <category> 中的内容同时能够匹配上 Intent 中指定的 action 和 category时,这个活动才能响应该 Intent。

我们也道,android.intent.category.DEFAULT 是一种默认的 category,在调用 startActivity() 方法的时候会自动将这 category 添加到 Intent 中(查看所有系统源码,也都带上了这个 category,我们也无需多去关心 category 它可能存在的坑了)。

对于Action的原理是:当 startActivity() 运行的时候,该Activity会去系统所有清单文件中找对应的 Action("") 里面能匹配的 Activity,找有没有对应的 action 与我们所写入的能匹配的,如果有(这里是 NextActivity),这样就启动了 NextActivity。

既然,NextActivity 有了动作,那么我们的 MainActivity 再添加一个按钮,使用隐式方式启动它。如下:

此时运行程序,发现能够正常启动。我们发现第一个例子启动打电话功能时候,还添加了一个 setData()。那么,我们自定义的也可以同样添加 data。修改清单文件 NextActivity 配置代码如下:

这个时候,我们再运行程序,发现程序崩溃。这是因为我们隐式启动代码中,并没有完全跟清单文件中 <intent-filter> 下面的内容匹配。要想匹配成功,我们也要去代码中设置 data。再回到小案例一中,我们也就知道了为什么启动打电话功能要设置 setData 了,还不是因为电话清单文件源码中有这个 data 标签吗。

在这里浅显介绍一下系统添加 data 下面的标签都有哪些。<data>标签中主要可以配置以下内容:

1. android:scheme

用于指定数据的协议部分。

2. android:host

用于指定数据的主机名部分。

3. android:port

用于指定数据的端口部分,一般紧随在主机名之后。

4. android:path

用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。

5. android:mimeType

用于指定可以处理的数据类型,允许使用通配符的方式进行指定。只有<data>标签中指定的内容和 Intent 中携带的 Data 完全一致时,当前活动才能够响应该 Intent。不过一般在<data>标签中都不会指定过多的内容,常见的是 mimeType 和 scheme。

给我们的隐式启动按钮加入如下代码:

intent.setData(Uri.parse("ydl:qwe"));

运行程序不再报错。

上边的内容,对于一个初学者来说是必须掌握的内容。那么再来看看一些细节问题,这些细节问题不知道,可能还真会让你不知道如何去隐式启动别的Activity!

深入分析隐式启动的细节

首先先从自定义隐式启动开始讨论。上边代码 Uri.parse() 参数内容 "ydl:qwe" 我们看到 qwe 好像很别扭,其实 setData 的英文名称就告诉我们设置数据的了。基于上面对系统<data>里面配置介绍,我们清单文件中是 android:scheme,这是一个协议,因而我们设置数据必须要以 scheme 后边内容开头。这里是 "ydl" 作为了协议。而后面 "qwe" 内容可以随便写。例如我改成如下代码:

intent"ydl:234"));

仍然可以启动下一个活动。

那么我们再回到最初的小案例,有如下代码:

intent"tel:" + phone));

这里不就是一个协议吗?在清单文件中对应的 Activity 肯定有这个协议,我们就去上层源码看一看,找到如下代码:

我们看到 android:permission 就是我们打电话要指定的权限。而往下看第一个 intent-filter

action android:name="android.intent.action.CALL" /> 不就是针对我们代码中要设置的Action(intent.setAction(Intent.ACTION_CALL);)吗?

到了这里,相信这个细节大家都能掌握了。那么接着往下继续爬坑~

我们发现,打电话 OutgoingCallBroadcaster 的清单文件中有太多的 intent-filter,看花了眼,我们到底怎么知道匹配哪个 intent-filter 才能启动打电话这个活动呢?其实,原理很简单,在清单文件中的 intent-filter 代表我们可以有好几种启动方式好几种写法去启动这个打电话这个活动。我们使用哪一种方式都无所谓的,都可以。那么我们模仿这种情况,来对自定义启动活动也这么添加几个 intent-filter,看完下面的内容,这些坑也就爬完了。

模仿源码为自己的活动配置不同的intent-filter

首先我们在清单文件中继续添加 intent-filter

此时两个intent-filter,我们为了验证刚才的说法,把启动活动的代码修改一下:

我们发现都改成了 ydl2,这样启动时匹配的是上边这个 intent-filter。能正常启动活动。

注意:启动活动代码必须与某一个 intent-filter 相匹配才能正常启动活动,否则会报错。这是为什么,相信我们很简单就能理解原因了。

继续跟进:

我们在清单文件中除了可以配置多个 intent-filter,还可以配置多个 data,以及多个 action 吗?(很多源码中也是这样的)。我们再把清单文件中代码作如下修改来试试:

这里添加了多个 data 多个 action,其实,在我们在启动活动的代码位置,只需要配置任意一条 data 以及任意一条 action 就可以成功启动这个 activity 了,不需要全部匹配。活动代码即使这么写,也是没有任何问题:

启动活动成功。

最后,还有一点点就完结了。即常见的 android:mimeType 这个属性。

我们知道了,data 是用来传递数据的,通过 setData 把数据放进里面,会把数据传递给目标Activity,在目标Activity可以通过 getIntent()(获取启动这个activity的意图对象)方式来获取里面的数据。而 android:mimeType 是用来定义你 setData 用来传递什么数据类型的。例如,一般我们传递文本数据,我们就可以这么写:

我们首先测试只有 android:mimeType 的时候。

android:mimeTypeandroid:scheme 同时存在的时候。我们需要注意:如果代码先设置 setData(),后 setType() 后者会把前者清理掉,反之亦然,这里就跟你女神问你“你妈和我掉水里你先救谁”原理是一样的。

我们需要通过 setDataAndType() 方法,把 scheme 和 mimeType 同时设置进去才能匹配对应的清单文件中的 intent-filter。例如我清单文件中代码是:

那么我们启动的时候,需要通过:

intent.setDataAndType(Uri"ydl2:qwe"),"text/username");

这样就能完好匹配清单文件内容,可以正常启动activity了。

终于写完了,相信看完此篇文章你对隐式启动活动的原理更加清晰了。以后启动任何互动,只需要看看那个活动的清单文件内容,就能轻松通过隐式启动的方式去打开它了!

最后,点击下方 阅读原文 可以跳转到作者的博客来阅读本文章哦!

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读5.3k次,点赞10次,收藏39次。本章详细写了mysql的安装,环境的搭建以及安装时常见的问题和解决办法。_mysql安装及配置超详细教程
文章浏览阅读1.8k次,点赞50次,收藏31次。本篇文章讲解Spark编程基础这门课程的期末大作业,主要围绕Hadoop基本操作、RDD编程、SparkSQL和SparkStreaming编程展开。_直接将第4题的计算结果保存到/user/root/lisi目录中lisipi文件里。
文章浏览阅读7.8k次,点赞9次,收藏34次。ES查询常用语法目录1. ElasticSearch之查询返回结果各字段含义2. match 查询3. term查询4. terms 查询5. range 范围6. 布尔查询6.1 filter加快查询效率的原因7. boosting query(提高查询)8. dis_max(最佳匹配查询)9. 分页10. 聚合查询【内含实际的demo】_es查询语法
文章浏览阅读928次,点赞27次,收藏18次。
文章浏览阅读1.1k次,点赞24次,收藏24次。作用描述分布式协调和一致性协调多个节点的活动,确保一致性和顺序。实现一致性、领导选举、集群管理等功能,确保系统的稳定和可靠性。高可用性和容错性Zookeeper是高可用的分布式系统,通过多个节点提供服务,容忍节点故障并自动进行主从切换。作为其他分布式系统的高可用组件,提供稳定的分布式协调和管理服务,保证系统的连续可用性。配置管理和动态更新作为配置中心,集中管理和分发配置信息。通过订阅机制,实现对配置的动态更新,以适应系统的变化和需求的变化。分布式锁和并发控制。
文章浏览阅读1.5k次,点赞26次,收藏29次。为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准;
文章浏览阅读1.2k次,点赞26次,收藏28次。在安装Hadoop之前,需要进行以下准备工作:确认操作系统:Hadoop可以运行在多种操作系统上,包括Linux、Windows和Mac OS等。选择适合你的操作系统,并确保操作系统版本符合Hadoop的要求。安装Java环境:Hadoop是基于Java开发的,因此需要先安装和配置Java环境。确保已经安装了符合Hadoop版本要求的Java Development Kit (JDK),并设置好JAVA_HOME环境变量。确认硬件要求:Hadoop是一个分布式系统,因此需要多台计算机组成集群。
文章浏览阅读974次,点赞19次,收藏24次。# 基于大数据的K-means广告效果分析毕业设计 基于大数据的K-means广告效果分析。
文章浏览阅读1.7k次,点赞6次,收藏10次。Hadoop入门理论
文章浏览阅读1.3w次,点赞28次,收藏232次。通过博客和文献调研整理的一些农业病虫害数据集与算法。_病虫害数据集
文章浏览阅读699次,点赞22次,收藏7次。ZooKeeper使用的是Zab(ZooKeeper Atomic Broadcast)协议,其选举过程基于一种名为Fast Leader Election(FLE)的算法进行。:每个参与选举的ZooKeeper服务器称为一个“Follower”或“Candidate”,它们都有一个唯一的标识ID(通常是一个整数),并且都知道集群中其他服务器的ID。总之,ZooKeeper的选举机制确保了在任何时刻集群中只有一个Leader存在,并通过过半原则保证了即使部分服务器宕机也能维持高可用性和一致性。
文章浏览阅读10w+次,点赞62次,收藏73次。informatica 9.x是一款好用且功能强大的数据集成平台,主要进行各类数据库的管理操作,是使用相当广泛的一款ETL工具(注: ETL就是用来描述将数据从源端经过抽取(extract)、转换(transform)、加载(load)到目的端的过程)。本文主要为大家图文详细介绍Windows10下informatica powercenter 9.6.1安装与配置步骤。文章到这里就结束了,本人是在虚拟机中装了一套win10然后在此基础上测试安装的这些软件,因为工作学习要分开嘛哈哈哈。!!!!!_informatica客户端安装教程
文章浏览阅读7.8w次,点赞245次,收藏2.9k次。111个Python数据分析实战项目,代码已跑通,数据可下载_python数据分析项目案例
文章浏览阅读1.9k次,点赞61次,收藏64次。TDH企业级一站式大数据基础平台致力于帮助企业更全面、更便捷、更智能、更安全的加速数字化转型。通过数年时间的打磨创新,已帮助数千家行业客户利用大数据平台构建核心商业系统,加速商业创新。为了让大数据技术得到更广泛的使用与应用从而创造更高的价值,依托于TDH强大的技术底座,星环科技推出TDH社区版(Transwarp Data Hub Community Edition)版本,致力于为企业用户、高校师生、科研机构以及其他专业开发人员提供更轻量、更简单、更易用的数据分析开发环境,轻松应对各类人员数据分析需求。_星环tdh没有hive
文章浏览阅读836次,点赞21次,收藏19次。
文章浏览阅读1k次,点赞21次,收藏15次。主要介绍ETL相关工作的一些概念和需求点
文章浏览阅读1.4k次。本文以Android、java为开发技术,实现了一个基于Android的博物馆线上导览系统 app。基于Android的博物馆线上导览系统 app的主要使用者分为管理员和用户,app端:首页、菜谱信息、甜品信息、交流论坛、我的,管理员:首页、个人中心、用户管理、菜谱信息管理、菜谱分类管理、甜品信息管理、甜品分类管理、宣传广告管理、交流论坛、系统管理等功能。通过这些功能模块的设计,基本上实现了整个博物馆线上导览的过程。
文章浏览阅读897次,点赞19次,收藏26次。1.背景介绍在当今的数字时代,数据已经成为企业和组织中最宝贵的资源之一。随着互联网、移动互联网和物联网等技术的发展,数据的产生和收集速度也急剧增加。这些数据包括结构化数据(如数据库、 spreadsheet 等)和非结构化数据(如文本、图像、音频、视频等)。这些数据为企业和组织提供了更多的信息和见解,从而帮助他们做出更明智的决策。业务智能(Business Intelligence,BI)...
文章浏览阅读932次,点赞22次,收藏16次。也就是说,一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大,这也是我们面向对象设计的核心原则:低耦合,高内聚。优秀的架构和产品都是一步一步迭代出来的,用户量的不断增大,业务的扩展进行不断地迭代升级,最终演化成优秀的架构。其根本思想是强调了类的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会波及有关系的类。缓存,从操作系统到浏览器,从数据库到消息队列,从应用软件到操作系统,从操作系统到CPU,无处不在。
文章浏览阅读937次,点赞22次,收藏23次。大数据可视化是关于数据视觉表现形式的科学技术研究[9],将数据转换为图形或图像在屏幕上显示出来,并进行各种交互处理的理论、方法和技术。将数据直观地展现出来,以帮助人们理解数据,同时找出包含在海量数据中的规律或者信息,更多的为态势监控和综合决策服务。数据可视化是大数据生态链的最后一公里,也是用户最直接感知数据的环节。数据可视化系统并不是为了展示用户的已知的数据之间的规律,而是为了帮助用户通过认知数据,有新的发现,发现这些数据所反映的实质。大数据可视化的实施是一系列数据的转换过程。