【译文】Android M中Intent的解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

原文链接 : Intent Resolving in Android M
原文作者 : Said Tahsin Dane
译文出自 : 开发技术前线 www.devtf.cn。未经允许,不得转载!
译者 : liuling07
校对者: desmond1121
状态 : 完成

译文连接:Android M中Intent的解析

注意了!在Android 6.0中,“隐式Intent”的解析不能像之前版本那样正常工作了。这很有可能导致你的app不能正常使用。

现在让我解释一下这个意料之中的问题以及为什么它不能正常使用: 最近,我正在开发一个小的开源项目,叫做“Open Link With”。希望不久后它能够在应用市场上架。

我的这个app能够让你在其他app之间随意切换。当你给我分享一个链接的时候,我基本上可以根据这个链接查询出所有可以处理这个链接的Activity。然后我会模拟一个系统对话框让你切换app。

从已经打开的youtube的web页面切换到youtube应用从已经打开的youtube的web页面切换到youtube应用

我一直都是使用下面的方法:

List<ResolveInfo> infos = packageManager
        .queryIntentActivities(intent, MATCH_DEFAULT_ONLY);

这段代码几乎所有Android开发者都比较熟悉,并且我也相信大部分app都有用到这段代码。

我的手机里有两个浏览器。“一个URL是Google+ 的Intent”期望得到一个具有3个ResolveInfo对象的列表(Google+应用以及两个浏览器)。

好吧,并不是这样!

欢迎来到Android 6.0!

Android 6.0引进了应用关联。系统主要通过你的web页面来认证,并且自动使用你的app来打开这些URL,而不会向你做任何请求。或者你可以到系统设置,选择 “应用程序”,然后点击一个应用,再点击“默认打开方式”,然后设置“用这个应用打开”,就可以每次都使用这个应用打开。

Android 6.0的应用默认设置页面Android 6.0的应用默认设置页面

在这种情况下,queryIntentActivities方法只会给开发者返回一个只有一个Activity的列表(此例子返回的是Google+)。

虽然这是在意料之中的,但是应该在文档中注明,因为它与公共API相矛盾了。

我研究了一下,发现了一个MATCH_ALL标志,文档表示,它将禁用所有的系统级过滤器。

/**
 * Querying flag: if set and if the platform is doing any filtering of the results, then
 * the filtering will not happen. This is a synonym for saying that all results should
 * be returned.
 */
public static final int MATCH_ALL = 0x00020000;

这对我来说没什么用。我打开源码(至少我有源码)并开始研究这个方法。

它似乎优先考虑验证应用程序的域,不仅在它的内部系统,在公共API中也是如此。

如果有一个验证应用程序的域,它不会返回任何其他东西。MATCH_ALL标志会移除一些系统过滤器,但是仅仅是在没有验证程序的情况下。

对于这个问题,我找不到任何可变通的措施。它只是排除浏览器应用,即使他们的IntentFilters匹配。

之所以没有可变通的措施,是因为他是一个内部组件(我们无法访问),Android SDK通过IPC使用AIDL与它进行通信。

大部分开发者使用这个方法来判断是否至少有一个Activity来处理隐式的Intent。在大多数情况下,列表中第一项就是你想要的。

在花了几个小时搞明白到底发生了什么之后,我尝试寻找一个我认为每个人都应该知道的解决方案。

在Android 6.0中,改动的地方很多。实际上谷歌提供了一些改变清单,在清单中你能看到到底有哪些改变。我认为还有很多类似上面的一些没有在清单中列出的改变,而这些改动很有可能导致你的应用无法正常运行。

所以如果你使用PackageManager的方法,你一定得小心,并且认真检查。

感谢此文的校对者:Yağmur DalmanSebastiano PoggiSalim KAYABAŞIHasan Keklik

相关文章
|
20天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
1月前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
46 2
|
16天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性解析
【7月更文挑战第11天】在移动应用开发的广阔天地中,安卓与iOS两大阵营各据一方,它们的开发环境差异如同东西方文化的差异一样鲜明。本文将深入探讨这两个平台在开发工具、编程语言、用户界面设计以及系统架构等方面的不同,旨在为开发者提供一个清晰的对比视角,帮助他们根据项目需求和个人偏好选择最合适的开发路径。
|
1月前
|
前端开发 JavaScript 测试技术
安卓应用开发中的架构模式解析
【6月更文挑战第21天】在软件开发领域,架构模式是设计优雅、高效、可维护应用程序的基石。本文深入探讨了安卓应用开发中常见的架构模式,包括MVC、MVP、MVVM和Clean Architecture,旨在为开发者提供一个清晰的指导,帮助他们选择最适合自己项目的架构风格。通过对比分析这些架构模式的特点、优势以及适用场景,文章揭示了如何根据项目需求和团队能力来采用恰当的架构模式,以实现代码的可维护性、可扩展性和可测试性。
32 7
|
1月前
|
Java 开发工具 Android开发
安卓与iOS开发差异解析
【6月更文挑战第21天】本文旨在深入探讨安卓和iOS两大移动操作系统在应用开发过程中的主要差异。通过对比分析,揭示各自的设计哲学、编程语言选择、用户界面构建、性能优化策略以及发布流程的异同。文章将提供开发者视角下的实用信息,帮助他们更好地理解各自平台的特点和挑战,从而做出更明智的开发决策。
|
1月前
|
搜索推荐 Android开发 iOS开发
深入解析安卓与iOS操作系统的异同
安卓和iOS是目前两大主流移动操作系统,它们分别代表了开放性和封闭性的设计理念。本文将从系统架构、用户界面、应用生态等方面深入探讨安卓和iOS之间的异同,帮助读者更好地理解这两个操作系统的特点和优势。
63 3
|
1月前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
24 1
|
1月前
|
XML Java Android开发
04. 【Android教程】Android 工程解析及使用
04. 【Android教程】Android 工程解析及使用
23 0
04. 【Android教程】Android 工程解析及使用
|
2月前
|
API vr&ar 开发工具
构建未来:安卓平台上的AR应用开发全解析
【5月更文挑战第25天】随着增强现实(AR)技术的不断成熟,安卓平台上的AR应用开发正吸引着越来越多的关注。本文深入剖析了在安卓系统上开发AR应用的核心技术和流程,探讨了ARCore SDK的使用、3D渲染技术、用户交互设计以及性能优化等关键要素。通过实例演示和代码分析,揭示了创建高效、沉浸式AR体验的策略和最佳实践,为开发者提供指引,同时对未来AR应用的发展趋势做出展望。
|
2月前
|
缓存 Java Android开发
构建高效的Android应用:内存优化策略解析
【5月更文挑战第25天】在移动开发领域,性能优化一直是一个不断探讨和精进的课题。特别是对于资源受限的Android设备来说,合理的内存管理直接关系到应用的流畅度和用户体验。本文深入分析了Android内存管理的机制,并提出了几种实用的内存优化技巧。通过代码示例和实践案例,我们旨在帮助开发者识别和解决内存瓶颈,从而提升应用性能。

推荐镜像

更多