Android即时应用程序是一种功能强大的新方法,可让您的应用程序吸引尽可能多的用户。
在为项目添加即时应用程序支持后,用户甚至无需安装应用程序即可访问其内容和功能-他们只需按以下步骤即可按需加载应用程序的整个部分点击一个URL。
在这个由三部分组成的系列文章中,我将介绍为Android项目添加即时应用程序支持的整个过程,因此,当您完成操作后,您将确切地知道如何创建可在任何位置发现和访问的Android应用程序。支持URL。
在第一篇文章中,我们研究了即时应用程序是什么以及它们如何工作,并研究了为何此新功能对于Android开发人员和Android用户而言都是如此重大的新闻。 以前,我们采用了一些捷径,并创建了一个内置了即时应用程序支持的Android项目,但是我们没有研究如何向现有项目中添加即时应用程序支持,因此我们将重点关注这一点。在这篇文章上。
我还将向您展示如何实现App Links,因此到本文结尾,您将创建一个功能全面的即时应用程序,您可以在任何兼容的Android设备上启动和测试该应用程序。
下载样例项目
向项目添加即时应用支持通常需要您对项目的结构进行一些相当大的改变。
您可能不太热衷于通过完全更改自己的Android项目之一的结构来尝试一项新功能的想法,因此,我提供了一个示例应用程序,您可以从GitHub下载该应用程序。 在整个本文中,我们将致力于更新此特定项目以支持即时应用程序功能。
从GitHub下载MyLocation项目,然后在Android Studio中打开它。 您会看到这是一个非常简单的项目,由一个包含一个Activity
( MapsActivity
)的单个应用程序模块MapsActivity
。
![MyLocation项目在Google地图上显示您的当前位置](https://i-blog.csdnimg.cn/blog_migrate/5f8b931c2e9d3b48d8dfc2637ae00eb1.png)
尽管您可以在当前状态下安装和启动该项目,但如果MapsActivity要显示任何真实内容,则需要生成API密钥并将其添加到该项目中:
- 打开项目的
res/values/google_maps_api.xml
文件。 - 按照此文件中的说明生成您的Google Maps API密钥。
- 将生成的密钥复制/粘贴到
google_maps_api.xml
文件中:
<string name="google_maps_key" templateMergeStrategy="preserve"
translatable="false">your_key_goes_here</string>
</resources>
我们将更新此项目,以便其单个功能(即在地图上显示用户当前位置的功能)可在即时应用程序表单中使用。 为此,我们将完成以下步骤:
- 创建一个基本功能模块,其中包含交付此单个功能所需的所有代码和资源。
- 创建一个即时应用模块,该模块将用作我们即时应用APK的容器。
- 使用应用链接将特定的URL映射到此基本功能模块。
在开始之前,您还需要注意以下几点:
- 在下一篇文章之前,我们不会在该项目中添加任何其他功能模块。 但是,正如您将在测试MyLocation时所看到的那样,通过创建基本功能模块和即时应用程序模块,完全有可能向项目添加即时应用程序支持-附加功能模块是可选的。
- 由于MyLocation项目仅包含一个功能,因此我们非常需要在基本功能模块中包含其所有代码和资源。 通过将该项目的应用程序模块转换为基本功能模块,然后创建一个新模块作为替换应用程序模块,我们可以使这项任务变得更加容易。 这是一个便捷的快捷方式,您可以在将即时应用功能添加到自己的真实Android项目中时使用。 但是,如果此快捷方式对于特定项目不可行,则需要创建一个新模块作为您的基本功能模块,然后花一些时间将所有相关的代码和资源移至该新的基本功能模块中。
将App模块转换为基本功能模块
我们的首要任务是将MyLocation的应用程序模块转换为基本功能模块。
当您使用多个模块时,它有助于尽早建立命名约定,因此在本文中,我将每个模块的类型( -app
, -base
, -instantapp
等)附加到模块名称之后:
- 按住Control键并单击该应用程序目录,然后选择Refactor> Rename…。
![从上下文菜单中选择“重构重命名”](https://i-blog.csdnimg.cn/blog_migrate/a8567ef0592e81d38988f30447e1b257.png)
- 在“ 重命名模块”窗口中,输入mylocation-base ,然后单击确定 。
- 打开新重命名的
mylocation-base
模块的build.gradle文件。 第一行显示此模块仍在使用默认的com.android.application
插件; 但是,所有功能模块都必须使用com.android.feature
插件,因此您需要对其进行更改以apply plugin: 'com.android.feature.'
。 - 通过将
baseFeature true
属性添加到android
代码块,使该模块是您项目的唯一基础特征模块。 - 任何支持即时应用程序功能的项目都将不可避免地由多个模块组成,但是您只需一次声明该项目的
applicationID
即可,并且在应用程序模块中。 为避免冲突和混乱,应从项目的其余部分中删除此属性,因此请在mylocation-base
build.gradle文件中找到applicationID
属性,然后将其删除。
完成所有这些步骤之后, mylocation-base
mylocation的build.gradle文件应如下所示:
apply plugin: 'com.android.feature'
android {
baseFeature true
compileSdkVersion 25
buildToolsVersion "26.0.0"
defaultConfig {
minSdkVersion 24
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
创建您的应用程序模块
此时,MyLocation缺少一个应用程序模块,因此让我们创建一个替换模块:
- 从Android Studio工具栏中选择新建>新建模块… 。
- 在出现的窗口中,选择“ 手机和平板电脑” ,然后单击“ 下一步” 。
- 让我们坚持已经建立的命名约定,并将其命名为mylocation-app 。 单击下一步 。
- 该模块应包含要包含在可安装应用程序中的代码和资源,但是为了使内容尽可能简单,请单击“ 添加无活动” ,然后单击“ 完成” 。
- 打开
mylocation-app
模块的清单文件。 如果回想一下我们在上一篇文章中创建的项目,您会记得该应用程序模块的清单几乎是空的,因为最终散布在该项目中的所有其他清单的内容最终都将与此文件合并。 这正是我们的MyLocation项目将要发生的事情,因此为避免合并过程中发生任何冲突,应删除此清单的整个application
块。
![从清单中删除应用程序代码块](https://i-blog.csdnimg.cn/blog_migrate/9253ccb4b8067d9297dbf0667de7b18a.png)
- 打开
mylocation-app
模块的build.gradle文件。 该模块取决于我们的mylocation-base
模块,因此请从dependencies
块中删除所有代码,并将其替换为以下内容:
dependencies {
implementation project(':mylocation-base')
}
- 通过切换到Android Studio的“ 项目”视图并删除src / androidTest目录,从应用程序模块中删除所有未使用的文件和目录。 然后,打开主目录并删除Java , res和test目录。
![删除以下文件和目录srcandroidTest mainJava mainres和maintest](https://i-blog.csdnimg.cn/blog_migrate/46d473e6919a8c86100bffb4ac49595f.png)
我们已成功将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内容。
创建即时应用程序模块
Instant App模块完成了作为项目生成的所有Instant App APK容器的简单但必不可少的任务。 要创建此模块:
- 从Android Studio工具栏中选择文件>新建>新建模块… 。
- 在随后的窗口中,选择Instant App ,然后单击Next 。
- 为该模块命名为mylocation-instantapp ,然后单击Finish 。
- 由于此即时应用程序模块仅包含基础功能模块
build.gradle
,因此我们需要打开其build.gradle
文件并将mylocation-base
声明为依赖项:
apply plugin: 'com.android.instantapp'
dependencies {
implementation project(':mylocation-base')
}
将应用程序链接添加到您的项目
用户通过点击映射到基本要素或要素模块的URL来启动即时应用程序。 这个URL可以在任何地方-可能是朋友直接通过电子邮件或即时消息发送给他们的URL。 也许是他们在推文,论坛或评论线程中发现的URL,或者是在Google搜索结果中弹出的URL。
无论出现在何处,当用户点击此链接时,Google Play都会识别出它与基本功能或功能模块相关联,并检索在用户设备上运行该特定模块所需的所有代码和资源。
在本节中,我们将使用App Link在基本功能模块和URL之间建立这种关系。 最初引入Android应用程序链接功能是为了帮助用户在尝试访问设备上已安装的应用程序可以处理的内容时绕过Android的应用程序选择对话框。 例如,如果您点击指向YouTube视频的链接,则系统可能会显示一个对话框,询问您是否要在YouTube应用程序中打开此链接。
在即时应用程序的上下文中,应用程序链接允许您将功能模块的入口点活动映射到特定的URL。 我们在第一部分中探讨了入口点活动,但作为回顾,它们是用户在启动基本功能或“常规”功能模块时看到的第一个活动。
当您将实时应用程序支持添加到现实生活项目中时,您需要确定哪个Activity对您的即时应用程序组件进行最有效的介绍,但是由于mylocation-base
只有一个Activity,因此该决定已经为我们而造!
数字资产链接
在本部分中,我们将使用Android Studio的内置App Links Assistant将MapsActivity
与URL www.example.com/maps关联,但首先要声明:
将数字资产链接文件上传到您正在使用的域(在本例中为www.example.com )是应用链接过程中的关键步骤,因为这是系统验证您的应用有权充当与该域关联的所有链接的默认处理程序。
尽管我将介绍生成和上传数字资产链接文件的过程,但由于我们不拥有www.example.com域,因此实际上将无法执行此步骤。 但是,奇怪的是,在编写本文时,即使您尚未将Digital Asset Link上传到关联的域,似乎也可以在AVD上测试即时应用程序组件,您只需要对Android Studio的运行时进行一些调整即可组态。
如果您确实可以轻松访问可托管数字资产链接文件的域,那么我建议您将www.example.com URL替换为真正的URL,然后将生成的数字资产链接文件上传到您的网站。 但是,即使您确实使用了www.example.com URL,也可以通过调整运行时配置来测试MyLocation的即时应用程序组件。
创建URL映射
Android Studio 2.3及更高版本带有内置的App Links Assistant,可以使向应用程序中添加App Link更加简单:
- 从Android Studio工具栏中选择工具>应用链接助手 。 助手将在Android Studio窗口的右侧以新面板的形式打开。
- 单击“ 打开URL映射编辑器”按钮。
- 在出现的“ URL到活动的映射”面板中,单击小号+图标。
- 在主机字段中,输入要与此项目关联的域; 我将使用www.example.com 。
下一步是输入要在映射中使用的特定URL。 您在此处有一些选择,因此打开“ 路径”下拉列表并从以下选项中进行选择:
- 路径 。 如果要将单个URL映射到入口点活动,则应选择此选项。 由于我只希望
MapsActivity
响应www.example.com/maps URL,因此我将从此下拉菜单中选择“ 路径” 。 我们已经将域名www.example.com与我们的项目相关联,因此我们只需要在随附的文本字段中输入URL的最后部分( / maps )。
![从下拉菜单中选择路径,然后在随附的文本字段中输入地图](https://i-blog.csdnimg.cn/blog_migrate/539cbe0812e2237119e43fcc4e6d7fc3.png)
- pathPrefix 。 通过该选项,您可以更灵活地触发触发入口点活动的URL。 例如,如果您选择pathPrefix ,然后在随附的文本框中输入www.example.com/maps ,则
MapsActivity
将响应URL,例如www.example.com/maps/mylocation和www.example.com/maps/nearby 。
- pathPattern 。 与Path相似,此选项使您可以指定启动入口活动的确切URL。 但是,通过允许您在随附的文本字段中使用通配符,它也为您提供了更多的灵活性。
接下来,您需要选择MapsActivity
作为该模块的入口点Activity:
- 打开活动下拉菜单。
- 选择.MapsActivity(mylocation-base) 。
- 单击确定 。
App Links Assistant会使用将MapsActivity
转换为该模块的入口点Activity所需的所有代码来帮助您更新清单。 如果查看一下mylocation-base
模块的清单,那么您将看到以下代码:
<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="http"
android:host="www.example.com"
android:path="/maps" />
</intent-filter>
</activity>
接下来,我们需要告诉MapsActivity
通过该URL启动时如何响应。 同样,App Links Assistant可以引导您完成此过程:
- 返回App Links Assistant,单击“ 选择活动”按钮。
- 选择要映射到您的URL的活动,在本例中为
MapsActivity
。 - 单击插入代码 ,然后App Links Assistant将以下代码插入
MapsActivity
:
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
}
当您要为自己的现实生活项目添加即时应用支持时,通常需要扩展此代码,具体取决于您希望Activity作为即时应用启动时的反应方式,但是出于我们的目的MyLocation项目,这几行就可以完成工作。
将您的应用程序与您的网站相关联
在本节中,我将向您展示如何生成数字资产链接文件,以及如何将该文件上传到您的网站。 如果您将www.example.com用作真实URL的替代品,则将无法完成此步骤,但是了解如何生成和上传此文件仍然很重要,以备不时之需。重新为您自己的Android项目添加即时应用支持。
要在您的域和应用程序之间创建此关联,您需要完成以下步骤:
- 在App Links Assistant中,单击“ 打开数字资产链接文件生成器”按钮。
- 输入您要与此应用程序关联的域,例如www.example.com 。
- 输入您的应用程序ID。
- 输入应用程序的签名配置,或选择一个密钥库文件。 虽然可以在测试过程中使用调试配置或密钥库,但是生成的Digital Asset Links文件将与您的应用的发行版不兼容。 如果您确实上传了使用调试配置或密钥库的Digital Asset Links文件,那么在发布您的应用程序之前,您需要生成并上传一个使用您的应用程序发布密钥的新Digital Asset Links。
- 单击生成数字资产链接文件按钮。
- 通过单击“ 保存文件”按钮下载数字资产文件。 在Android Studio 3.0的Canary版本中,此按钮有时位于屏幕外,因此您可能需要调整Android Studio窗口的大小,以使“ 保存文件”按钮不再隐藏。 单击此按钮会将
assetlinks.json
文件下载到您的计算机。 - 您必须在以下地址HTTPS举办assetlinks.json文件:// <yoursite> /.well-known/assetlinks.json,所以上传新下载的文件assetlinks.json这个确切位置。 另请注意,Android通过加密的HTTPs协议验证assetlinks.json文件,因此您需要确保可通过HTTPS连接访问此文件。
- 返回Android Studio,单击“应用程序链接助手”的“ 链接并验证”按钮。 如果您正在使用本教程的www.example.com替代链接进行后续操作,则Android Studio应该报告您已成功完成每个步骤, 除了上载Digital Asset Links文件。
测试您的即时应用
现在,您终于可以测试MyLocation的即时应用程序组件了!
具体来说,我们要测试的是,如果用户的设备上未安装MyLocation,则点击www.example.com/maps链接将使他们能够访问mylocation-base模块:
- 启动与应用程序兼容的即时AVD。
- 通过打开启动器,确认您的AVD上未安装MyLocation应用。 如果确实找到MyLocation应用,请通过将其拖动到设备的“ 卸载”图标来将其卸载 。
- 接下来,您需要对我们项目的运行配置进行一些调整, 尤其是当您使用www.example.com/maps触发基于mylocation的模块时。 首先从Android Studio工具栏中选择运行>编辑配置...。
- 从左侧菜单中选择mylocation-instantapp 。
- 打开启动下拉列表并将其设置为URL 。
- 删除<>文本,并将其替换为您要使用的URL,例如http://www.example.com/maps 。 选择此运行配置后,它将模拟用户点击www.example.com/maps链接。
![删除错误文本,并将其替换为wwwexamplecommaps](https://i-blog.csdnimg.cn/blog_migrate/6f3512def79843477dd1cb5fd814b3af.png)
- 单击“ 应用” ,然后单击“ 确定” 。
- 从Android Studio工具栏中选择运行>运行...。
- 选择mylocation-instantapp作为要启动的组件。
- 选择目标AVD,然后单击确定 。
- 如果这是您首次在此特定的AVD上运行即时应用程序,则设备将提示您选择即时应用程序。 阅读免责声明,如果您乐于继续,请单击“ 是,我在” 。
现在,Android Studio将模拟您点击www.example.com/maps链接,并且AVD应该通过加载基本功能模块来做出响应。 此时, MapsActivity
将显示在屏幕上,您将能够与它进行交互,就像在此设备上安装了MyLocation一样。
要验证此设备上确实不存在MapsActivity
,请最小化MapsActivity
并打开AVD的启动器-MyLocation应用程序应完全不存在,但是如果您单击AVD的“ Recents”功能键,则MapsActivity
仍可见并在此设备上可用。
您可以从GitHub下载MyLocation项目 ,该项目已通过完整的即时应用程序支持进行了更新。
故障排除
即时应用程序仍然是一个新功能,因此遇到错误消息,错误和其他奇怪行为并不罕见,尤其是当您使用Android Studio 3.0的Preview或Canary版本之一时。
您将遇到的最常见问题是,从Android Studio工具栏中选择“运行”>“运行Instantapp ”时,通过显示应用选择器对话框或在其默认浏览器中打开URL,使AVD做出响应。 如果发生这种情况,则意味着AVD无法正确识别您的URL已映射到即时应用程序模块,并且像常规URL一样对其进行处理。
假设您已正确实现即时应用程序支持,则AVD可能拒绝合作的原因可能有以下几种:
AVD是否已设置为允许即时应用程序?
根据您创建的AVD,可能需要显式告知AVD支持即时应用程序:
- 打开AVD的“设置”应用。
- 选择Google 。
- 滚动到服务部分。
- 如果发现即时应用程序选项,请点按它。
- 在随后的屏幕上,将滑块拖动到“ 打开”位置。
- 重复尝试在AVD上启动即时应用程序模块的过程,以查看是否已解决您的问题。
您的语言环境是否支持即时应用程序?
并非每个地区都支持即时应用程序,因此请检查您所在的地区当前是否可以使用即时应用程序。 如果不是,那么您将需要使用adb(Android调试桥)命令来诱使您的AVD认为您在其他位置:
- 如果您使用的是Windows,请打开“终端”(如果您是Mac用户)或“命令提示符”。
- “更改目录”,因此终端或命令提示符指向您的Android SDK中包含的adb程序,例如:
cd /Users/jessicathornsby/Library/Android/sdk/platform-tools
- 接下来,输入以下命令:
adb shell
- 一旦“
#
出现在“终端”或“命令提示符”窗口中,请输入下一个命令:
setprop persist.sys.locale [ISO language code, plus country/region code] ;stop;sleep 5;start
- AVD现在将重新启动,并且重新启动后将使用新的区域设置。 现在,您应该能够在此设备上成功运行即时应用程序。
如果其他所有方法都失败了...。
如果以上修复方法均无效,则可以通过adb命令触发即时应用程序组件,而不是通过导航各种Android Studio菜单来获得一些积极的结果:
- 打开终端或命令提示符窗口。
- 使用
cd
命令,以便终端/命令提示符指向adb程序。 - 输入以下命令,确保用您要使用的URL替换
complete-url-path
:
./adb shell am start -a android.intent.action.VIEW -d complete-url-path
侧面加载即时应用失败
有时,Android Studio可能甚至拒绝甚至在您的AVD上加载即时应用程序组件,因为一些开发人员报告说,他们在尝试启动即时应用程序时遇到以下错误:
侧面加载即时应用失败:读取捆绑软件超时。
如果您确实在Android Studio中遇到此错误消息,那么通常可以通过清除缓存来解决该错误消息:
- 从Android Studio工具栏中选择运行>编辑配置… 。
- 从左侧菜单中选择mylocation-instantapp 。
- 选择即时应用程序配置 (在此窗口底部)。
- 点击铅笔图标。
- 选择清除预配置的设备缓存 。
![选择清除配置的设备缓存复选框,然后单击确定。](https://i-blog.csdnimg.cn/blog_migrate/ebd0278526abe10fa0c2a6d0f23f0b6c.png)
- 单击确定 ,其次是应用 ,然后点击确定一次。
- 尝试在AVD上重新启动您的即时应用程序组件-该问题现在应该已解决。
结论
在本文中,我们研究了如何通过创建基本功能模块和即时应用程序模块,实现应用程序链接,然后在AVD上测试该项目来更新现有的Android项目以支持即时应用程序。
至此,您已具备将即时应用程序功能添加到现有Android项目所需的全部信息,但有一个限制:我们仅创建了一个基本功能模块。 这意味着,目前,您只能为每个项目提供一项即时应用功能。
翻译自: https://code.tutsplus.com/tutorials/how-to-create-an-instant-app-feature--cms-29298