Advertisement
  1. Code
  2. Android SDK

如何创建即时应用程序功能

by
Read Time:19 minsLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

Android即时应用程式是让应用程式尽可能多的被用户使用的新方式。 

在您的项目中添加即时应用程序支持后,用户甚至不需要安装应用程序来访问其内容和功能 - 通过点击一个URL它们可以根据需要加载应用程序的整个部分。

在这三部分系列中,我将讨论将Android即时应用程序支持添加到Android项目的整个过程,所以在完成之后,您将完全了解如何创建能在任何支持URL的位置被发现和访问的Android应用程序。 

在第一篇文章中,我们研究了即时应用程序是什么、其工作原理以及为什么这项新功能对Android开发人员和Android用户来说是如此大的消息。以前,我们走了捷径,并创建了一个内置即时应用程序支持的Android项目,但我们并没有看到如何为现有项目添加即时应用程序支持,所以这就是本文要讨论的内容。

我还将介绍如何实现App Links,因此在本文结尾处,您将创建一个功能齐全的即时应用程序,您可以在任何兼容的Android设备上启动和测试。

下载示例项目 

向项目添加即时应用程序支持通常需要对该项目的结构进行一些非常大的改变。 

有可能您不太想通过完全改变自己的Android项目的结构来尝试新功能,所以我提供了一个可以从GitHub下载的示例应用程序。在整篇文章中,我们将更新这个具体的项目以支持即时应用程序功能。 

从GitHub下载MyLocation项目并在Android Studio中打开它。你会看到这是一个非常简单的项目,由包含一个Activity(MapsActivity)的单个应用程序模块组成  。 

The MyLocation project displays your current location on a Google MapThe MyLocation project displays your current location on a Google MapThe MyLocation project displays your current location on a Google Map

虽然您可以在当前状态下安装并启动此项目,但如果MapsActivity将显示任何实际内容,则需要生成API密钥并将其添加到此项目中: 

  • 打开项目res/values/google_maps_api.xml文件。
  • 按照此文件中的说明生成您的Google Maps API密钥。
  • 将生成的密钥复制/粘贴到google_maps_api.xml文件中:

我们将更新此项目,以便即时应用程序可以使用其单一功能(即在地图上显示用户当前位置的功能)。要实现这一点,我们要完成以下步骤:  

  • 创建一个基本功能模块,其中包含传递此单个功能所需的所有代码和资源。 
  • 创建即时应用程序模块,作为我们即时应用APK的容器。 
  • 使用“应用程序链接”将特定URL映射到此基本功能模块。

在开始之前,还需要注意以下几点:

  • 在下一篇文章之前,我们不会在此项目中添加任何其他功能模块。然而,正如您将看到,当我们来测试MyLocation时,完全可以通过创建基本功能模块和即时应用程序模块为项目添加即时应用程序支持 - 额外的功能模块是可选功能。
  • 由于MyLocation项目仅由一个功能组成,所以我们几乎需要将所有代码和资源都包含在基本功能模块中。通过将该项目的应用程序模块转换为基本功能模块,然后创建一个新的模块替代应用程序模块,我们可以更轻松地完成此任务。 这是一个方便的快捷方式,您可以在将即时应用功能添加到自己的现实生活中的Android项目中时使用。但是,如果这个快捷方式对于特定的项目是不可行的,那么您需要创建一个新的模块来充当您的基本功能模块,然后花费一些时间将所有相关代码和资源移动到新的基本功能模块中。 

将应用程序模块转换为基本功能模块

我们的第一个任务是将MyLocation的应用程序模块转换为基本功能模块。

当你有多个模块的工作,尽早建立命名约定是有帮助的,所以在这篇文章中,我将要追加每个模块的类型(-app,-base,-instantapp等)模块的名称: 

  • Control -点击应用程序目录并选择Refactor> Rename ...
Select Refactor Rename from the context menuSelect Refactor Rename from the context menuSelect Refactor Rename from the context menu
  • 在“ Rename module”模块窗口中,输入mylocation-base,然后单击“ 确定”。 
  • 打开新命名的mylocation-base模块的build.gradle文件。第一行显示,该模块仍在使用默认com.android.application插件; 但是,所有功能模块都必须使用com.android.feature插件,因此您需要将其更改为apply plugin: 'com.android.feature.'。
  • 明确指出,该模块是您项目的唯一基础功能模块,通过将baseFeature true属性添加到android代码块。 
  • 支持即时应用功能的任何项目都将不可避免地由多个模块组成,但您只需要一次声明该项目applicationID即可。为了避免冲突和混乱,您应该从项目的其余部分删除此属性,因此请在mylocation-basebuild.gradle文件中找到applicationID属性,然后将其删除。 

完成所有这些步骤后,mylocation-base的 build.gradle文件应该如下所示:

创建应用程序模块 

此时,MyLocation缺少一个应用程序模块,所以让我们创建一个: 

  • 从Android Studio工具栏中选择新建>新建模块...。
  • 在出现的窗口中,选择手机和平板电脑,然后单击下一步
  • 坚持我们建立的命名约定,将这个模块命名为mylocation-app。单击下一步。 
  • 此模块应包含要包含在可安装应用程序中的代码和资源,但为了保持尽可能简单的方式,请单击“ 添加无activity”,然后单击“ 完成”。
  • 打开你的mylocation-app模块的清单文件。如果您回到上一篇文章中创建的项目,您会记得应用程序模块的清单几乎是空的,因为最终将散布在整个项目中的所有其他清单的内容将与此文件合并。 这正是我们的MyLocation项目会发生的,所以为了避免合并过程中的任何冲突,你应该删除这个清单的整个application块。 
Delete the application block of code from your ManifestDelete the application block of code from your ManifestDelete the application block of code from your Manifest
  • 打开mylocation-app模块的build.gradle文件。该模块取决于我们的mylocation-base模块,因此从dependencies块中删除所有代码,并将其替换为以下内容: 
  • 通过切换到Android Studio的Project视图并删除src / androidTest目录,从应用程序模块中删除所有未使用的文件和目录。然后,打开主目录并删除Javarestest目录。
Delete the following files and directories srcandroidTest mainJava mainres and maintestDelete the following files and directories srcandroidTest mainJava mainres and maintestDelete the following files and directories srcandroidTest mainJava mainres and maintest

我们已将MyLocation的所有功能成功地移植到可共享的基本功能模块中。由于这需要我们对项目结构进行一些非常大的改变,所以您应该检查MyLocation是否仍然可以作为可安装的应用程序运行:

  • 启动我们在第一部分创建的AVD(Android虚拟设备),或连接与即时应用功能兼容的物理Android设备 - 在撰写本文时,仅限于Nexus 5X、Nexus 6P、Pixel、Pixel XL、或运行Android 6.0或更高版本的Galaxy S7。
  • 从Android Studio工具栏中选择运行>运行...。
  • 选择mylocation-app模块。 
  • MyLocation应用程序将显示在屏幕上,假设您为此项目生成了Google Maps API密钥,则应显示一些Google Maps内容。 

创建即时应用模块 

即时应用程序模块满足简单但重要的任务,作为您的项目生成的所有即时应用APK的容器。要创建此模块:

  • 从Android Studio工具栏中选择文件>新建>新建模块...。
  • 在后续窗口中,选择“ 即时应用”,然后单击“ 下一步”。 
  • 给这个模块命名为mylocation-instantapp,然后单击完成。 
  • 由于此即时应用程序模块仅存在于包含我们的基本功能的模块,因此我们需要打开其build.gradle文件并声明mylocation-base为依赖关系: 

添加应用程序链接到项目

用户通过点击映射到基本功能或功能模块的URL来启动即时应用程序。这个URL可能在任何地方 - 也许这是朋友通过电子邮件或即时消息直接发送的URL; 也许这是一个他们在推特、论坛或评论上发现的网址或者在他们的Google搜索结果弹出一个网址。 

不管该URL在哪里,当用户点击此链接时,Google Play将会识别它与基本功能或功能模块相关联,并检索在用户设备上运行此特定模块所需的所有代码和资源。

在本节中,我们将使用App Links在基础功能模块和URL之间建立这种关系。Android App Links功能最初是为了帮助用户绕过Android的应用选择对话框,当他们在尝试访问可以由其设备上已安装的应用程序处理的内容时。 例如,如果您点击YouTube视频的链接,系统可能会显示一个对话框,询问您是否要在YouTube应用中打开此链接。

在即时应用程序的上下文中,App Links允许您将功能模块的入口Activities映射到特定的URL。我们在第一部分探讨了入口Activities,但作为一个回顾,它们是用户在启动基本功能或“常规”功能模块时看到的第一个Activity。 

当您为现实生活中的项目添加即时应用程序支持时,您需要确定哪个Activity可以最有效地介绍您的即时应用程序组件,但由于mylocation-base只有一个Activity,因此只能用它了! 

Digital Asset链接

在本节中,我们将使用Android Studio的内置应用链接助手MapsActivitywww.example.com/maps网址关联,但首先是免责声明:

将Digital Asset链接文件上传到您正在使用的域(在这种情况下,www.example.com)是应用程序链接过程中的关键步骤,因为系统将验证您的应用程序是否有与此域相关联的所有链接的默认处理程序。

虽然我将介绍生成和上Digital Asset链接文件的过程,因为我们不拥有www.example.com域,所以我们实际上将无法执行此步骤。然而,奇怪的是,在撰写本文时,似乎可以在AVD上测试即时应用程序组件即使您尚未将Digital Asset链接上传到相关联的域 - 您只需要对Android Studio的运行时进行一些调整组态。 

如果您可以轻松访问可以托管Digital Asset链接文件的域,那么我建议您使用正确的URL 替换www.example.com网址,并将生成的Digital Asset链接文件上传到您的网站。不过,即使您使用www.example.com网址,您仍然可以通过调整运行时配置来测试MyLocation的即时应用程序组件。

创建URL映射

Android Studio 2.3及更高版本附带了一个内置的App Links Assistant,使您的项目更加简单的添加App Links: 

  • 从Android Studio工具栏中选择工具>应用程序链接助手。该助手将作为Android Studio窗口右侧的新面板打开。 
  • 点击打开URL映射编辑按钮。
  • URL到活动映射显示面板,点击小+图标。 
  • 在“ 主机”字段中,输入要与此项目关联的域; 我将使用www.example.com。 

下一步是在映射中输入要使用的特定URL。您在这里有几个选项,因此请打开“ 路径”下拉列表并选择: 

  • 路径。如果要将单个URL映射到入口activity,则应选择此选项。由于我只想MapsActivity响应www.example.com/maps网址,我将从此下拉菜单中选择“ 路径”。 我们已将域名www.example.com与我们的项目相关联,因此我们只需要将URL(/ maps)的最后一部分输入到随附的文本字段中。 
Select Path from the dropdown menu and enter maps in the accompanying text fieldSelect Path from the dropdown menu and enter maps in the accompanying text fieldSelect Path from the dropdown menu and enter maps in the accompanying text field
  • pathPattern。与“ 路径”类似,此选项允许您指定应启动入口activity的确切URL。但是,通过允许您在随附的文本字段中使用通配符,它还可以提供更多的灵活性。 

接下来,您需要选择MapsActivity作为此模块的入口activity:

  • 打开Activity下拉菜单。
  • 选择.MapsActivity(mylocation-base)
  • 单击确定

App Links助手有助于更新您的清单,其中包含所有必需的代码以便将MapsActivity转换为此模块的入口activity; 如果您查看mylocation-base模块的清单,那么您将看到以下代码: 

接下来,我们需要告诉MapsActivity如何通过此URL启动它。再次,App Links Assistant可以引导您完成此过程:

  • 回到App Links Assistant,点击选择activity按钮。 
  • 选择要映射到您的URL的activity,在这种情况下选择MapsActivity。 
  • 点击插入代码,App Links Assistant会将以下代码插入到MapsActivity: 

当您为自己的现实生活项目添加即时应用程序支持时,通常需要扩展此代码,具体取决于当您的Activity作为即时应用启动时,您希望activity的反应,但为了我们的MyLocation项目,这几行代码就完成工作了。 

将应用程序与网站关联

在本节中,我将展示如何生成Digital Asset链接文件以及如何将此文件上传到您的网站。如果您使用www.example.com作为正版网址的替代品,那么您将无法完成此步骤,但了解如何生成和上传此文件仍然很重要,为您自己的Android项目添加即时应用程序支持。 

要在您的域和应用程序之间创建此关联,您需要完成以下步骤: 

  • 在App Links Assistant中,单击打开Digital Asset链接文件生成器按钮。
  • 输入您要与此应用关联的域,例如www.example.com。  
  • 输入您的应用程序ID。
  • 输入您的应用程序的签名配置,或选择密钥库文件。虽然在测试期间可以使用调试配置或密钥库,但生成的Digital Asset链接文件将与应用程序的发行版本不兼容。 如果您上传使用调试配置或密钥库的Digital Asset链接文件,则在发布应用程序之前,您需要生成并上传使用应用程序发行版的新Digital Asset链接。
  • 单击生成Digital Asset链接文件按钮。 
  • 通过单击保存文件按钮下载Digital Asset文件。在Android Studio 3.0的Canary版本中,此按钮有时位于屏幕外,因此您可能需要调整Android Studio窗口的大小,才能使保存文件按钮脱离隐藏状态。 点击此按钮将assetlinks.json文件下载到您的计算机。 
  • 你必须在https:// /.well-known/ assetlinks.json地址有assetlinks.json文件的,所以上传新下载的assetlinks.json文件到这个确切位置。另请注意,Android将通过加密的HTTP协议验证assetlinks.json文件,因此您需要确保此文件可通过HTTPS连接进行访问。
  • 返回Android Studio,点击App Link Assistant的链接并确认按钮。如果您使用www.example.com独立链接跟随本教程,则Android Studio应报告您已成功完成每一步,但上传Digital Asset链接文件除外。

测试即时应用程序 

现在,您终于可以测试MyLocation的即时应用程序组件!

具体来说,我们想测试一下,如果用户的设备上没有安装MyLocation,那么点击www.example.com/maps链接就可以访问mylocation-base模块:

  • 启动即时应用兼容的AVD。
  • 验证MyDocation应用程序没有安装在AVD上通过打开launcher。如果您发现MyLocation应用程序,请将其拖放到设备的“ 卸”图标上。 
  • 接下来,您需要对项目的运行配置进行一些调整,特别是如果您使用www.example.com/maps触发您的基于位置的模块。首先从Android Studio工具栏中  选择运行>修改配置...
  • 从左侧菜单中选择mylocation-instantapp。 
  • 打开启动下拉列表并将其设置为URL
  • 删除<>文本,并将其替换为要使用的URL,例如http://www.example.com/maps。当您选择此运行配置时,它将模拟用户点击www.example.com/maps链接。 
Delete the Error text and replace it with wwwexamplecommapsDelete the Error text and replace it with wwwexamplecommapsDelete the Error text and replace it with wwwexamplecommaps
  • 单击应用,然后单击确定。 
  • 从Android Studio工具栏中选择运行>运行...
  • 选择mylocation-instantapp作为您要启动的组件。 
  • 选择您的目标AVD,然后单击确定。 
  • 如果这是第一次在这个特定AVD上运行即时应用程序,那么该设备将提示您选择加入即时应用程序。阅读免责声明,如果您乐意继续操作,请点击是,我进入

Android Studio现在将模拟您点击www.example.com/maps链接,AVD应通过加载基本功能模块进行响应。现在,MapsActivity会出现在屏幕上,您将能够完全与安装在此设备上的MyLocation进行交互。 

为了验证MyLocation真的不存在于此设备上,最小化MapsActivity并打开AVD的启动器 - MyLocation应用程序应该完全不存在,但是如果单击AVD的“ 重新启动”软键,MapsActivity则该设备仍然可见。 您可以从GitHub 下载MyLocation项目,更新完整的即时应用程序支持。

您可以从GitHub 下载MyLocation项目,更新完整的即时应用程序支持。

故障排除

即时应用仍然是一个新功能,因此遇到错误消息、错误和其他奇怪的行为并不常见,特别是如果您使用的是Android Studio 3.0的预览版或Canary版本。

您将遇到的最常见问题是,从Android Studio工具栏中选择Run> Run instantapp时,通过显示应用程序选择器对话框或通过在其默认浏览器中打开该URL来让AVD作出响应。如果发生这种情况,那么这意味着AVD没有正确地识别出您的URL被映射到即时应用程序模块,并且像正常URL一样处理它。

假设您已经正确实实现了应用程序支持,您的AVD拒绝合作有几个可能的原因: 

您的AVD设置是否允许即时应用?

根据您创建的AVD,您可能需要明确告知您的AVD才能支持即时应用:

  • 打开AVD的设置应用程序。
  • 选择Google
  • 滚动到“ 服务”部分。
  • 如果您发现即时应用程序选项,请点击。
  • 在随后的屏幕上,将滑块拖动到打开位置。 
  • 重复尝试在您的AVD上启动即时应用程序模块的过程,以查看是否已经解决了您的问题。

您的区域设置中是否支持即时应用?

每个地区都不支援即时应用程式,因此请检查即时应用程式目前在世界各地可用。如果没有,那么您需要使用adb(Android Debug Bridge)命令来骗AVD认为您处于不同的位置:  

  • 如果您在Windows上,请打开终端(如果您是Mac用户)或命令提示符。
  • “更改目录”,以便终端或命令提示符指向Android SDK中包含的adb程序,例如: 
  • 接下来,输入以下命令:
  • 一旦#出现在“终端”或“命令提示符”窗口中,输入下一个命令: 
  • 您的AVD现在将重新启动,一旦重新启动,它将使用新的区域设置。您现在应该可以在此设备上成功运行即时应用程序。 

如果全部失败...

如果上述任何修补程序都不起作用,则可以通过从adb命令触发即时应用程序组件而不是导航各种Android Studio菜单来获得一些有用的结果: 

  • 打开终端或命令提示符窗口。
  • 使用cd命令,使终端/命令提示符指向adb程序。 
  • 输入以下命令,确保替换complete-url-path为要使用的URL:

Side Loading Instant App Failed

有时,Android Studio可能会直接拒绝在AVD上加载即时应用程序组件,因为一些开发人员报告,只要他们尝试启动即时应用程序时遇到以下错误:

Side loading instant app failed: Reading bundle timed out.

如果您在Android Studio中遇到此错误消息,则通常可以通过清除缓存来解决此问题: 

  • 从Android Studio工具栏中选择运行>编辑配置...。
  • 从左侧菜单中选择mylocation-instantapp
  • 选择即时应用程序配置(朝向此窗口的底部)。
  • 点击铅笔图标。
  • 选择清除配置的设备缓存。
Select the Clear provisioned devices cache checkbox then click OKSelect the Clear provisioned devices cache checkbox then click OKSelect the Clear provisioned devices cache checkbox then click OK
  • 点击OK,其次是应用,然后打OK一次。 
  • 尝试重新启动您的AVD即时应用程序组件 - 现在应该解决问题。 

结论 

在本文中,我们研究了如何更新现有的Android项目以支持即时应用程序,通过创建基本功能模块和即时应用程序模块,实现App Links,然后在AVD上测试此项目。 

此时,您拥有了将即时应用功能添加到现有Android项目需要的所有信息,但有一个限制:我们只创建了一个基本功能模块。这意味着,目前,您只能为每个项目提供一个即时应用功能。

在本系列的最后一篇文章中,我们将通过查看如何向MyLocation项目添加额外的功能模块来改善这一点。 很快就出来了, 与此同时,请查看我们在Android应用程序开发中的其他一些精彩帖子!


关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.