每次发布Android应用程序时,您至少会对要实现的应用程序有一个大概的了解。
这些目标可能非常具体,例如在第一季度产生了一定数量的广告收入,也可能更广泛,例如在Google Play上获得了很高的评价。
无论您的愿望清单上有什么其他内容,只要能在尽可能多的用户面前展示您的应用程序, 总会在该列表中的某个位置出现功能-Android Instant Apps是一项新功能,可以帮助您做到这一点。
Instant Apps通过使您的应用程序可从支持URL的任何位置(包括电子邮件,Google搜索结果,社交媒体上的帖子)被发现和访问,从而为您提供了一种全新的方式来吸引当前尚未在其设备上安装应用程序的用户。平台,YouTube评论和论坛。
本质上,Instant Apps允许您将每个应用程序功能分离到一个独立的模块中。 然后,用户可以通过点按已映射到该特定模块的URL来按需加载这些即时应用程序模块中的任何一个,而无需随时安装您的应用程序。
在这个由三部分组成的系列文章中,我将向您展示如何向您的Android项目添加Instant App支持。 在本系列文章的最后,您将创建一个包含两个单独的Instant App功能模块的应用程序,您可以在任何兼容的Android设备上启动和测试这些模块。
我们要涵盖的内容
在第一篇文章中,我将重点介绍什么是Instant Apps,它们如何工作以及为什么要关心它们。 为了给您一些Instant Apps的第一手经验,我们将使用Android Studio的项目创建向导来生成一个预先配置有Instant App支持的应用程序,这样您就可以查看所有不同的Instant App组件,而不是而不是简单地阅读它们。
在创建预先配置有Instant App支持的应用程序是使用此功能的最快,最简单的方法时,实际上,您更有可能将Instant App支持添加到现有项目中-因此在第二部分中,我将向您展示如何做到这一点。 我将提供一个可从GitHub下载的应用程序,然后逐步完成重新配置该项目以支持Instant Apps的分步过程。
难题的最后一步是创建多功能的Instant App,因此在第三部分中,我将向您展示如何向应用程序中添加第二个功能模块,以及如何使用Android App链接将此模块映射到其他URL 。
什么是即时应用程序?
描述即时应用程序的最佳方法之一是查看一个何时使用它们的示例。
想象一下,有一个朋友给您发送了一个猫视频的链接,他们承诺您会爱上您,但是当您点击该链接时,很明显,您需要先下载一个应用,然后才能观看该特定视频。
无论您最终要下载该应用程序,还是忽略链接,并有可能错过互联网所能提供的最佳猫视频,这都是糟糕的用户体验,而且这是许多Android用户都熟悉的情况。
我们大多数人都有安装应用程序以完成一次性任务的经验。 例如,您可能下载一个应用程序只是为了查看某人发送给您的电子邮件附件,在特定网站上完成购买或跟踪当前正在发送到您地址的包裹。
现在让我们再次想象一下猫视频场景,但是这次应用程序的开发人员将播放视频内容所需的所有代码和资源都放置在自己的即时应用程序功能模块中,并将该模块映射到www.example.com/video URL。 这次,当您点击www.example.com/video/cat-video时 ,Google Play识别出该URL与即时应用模块相关联,并检索了播放该视频所需的所有代码和资源。 最终结果? 您可以享受在一个盒子一只猫打了20秒,而无需安装任何东西,这是一个更好的用户体验。
为什么要开始使用即时应用功能?
正如您将在本系列的下一篇文章中看到的那样,向现有项目添加Instant App支持可能是一个艰巨的过程,通常需要您完全改变应用程序的结构方式。
由于重组项目并不是一个轻而易举的决定,因此在本节中,我将通过涵盖为您的应用程序添加Instant App支持的所有主要好处,来帮助您确定所有时间和精力是否真的值得项目:
- 它消除了您的应用程序与新用户之间的障碍。 通过Google Play安装应用程序并不是一个特别困难或耗时的过程,但这仍然是您的应用程序与潜在新用户之间的最大障碍。 无论您花多少时间来制作引人注目的Google Play页面,大多数用户都会争抢该“ 安装”按钮,某些人总是会在安装时退出。
- 它可以帮助您吸引新用户。 尽管您始终可以在网络上的各个位置(例如您自己的网站,博客或社交媒体)上推广应用,但以前与新用户建立联系需要他们在某个时候访问您应用的Google Play页面(极少喜欢侧加载其应用的用户)。 即时应用程序使应用程序可以从任何支持URL的位置直接访问,从而消除了对应用程序Google Play页面的依赖,从而为您提供了几乎无限的与新用户联系的机会。
- 它可以确保共享内容是您应用的最佳广告。 共享您应用内容的用户是吸引新受众的最有效方法之一,因此,您将给人留下良好的第一印象! 以前,很难为没有在您的设备上安装您的应用程序的用户提供一致的体验,但是即时应用程序可让您确保所有人的无缝原生体验。
- 即使面对互联网限制,也可以帮助用户访问您的应用。 尽管Internet覆盖范围一直在不断改善,但是您有时仍可能难以找到快速可靠的网络,或者您可能正在接近每月的数据限额,并担心会产生额外的费用。 当您遇到Internet连接缓慢或不一致的问题时,下载整个应用程序可能是一个耗时且令人沮丧的过程,并且当您有可能超出数据限额的危险时,下载新应用程序可能就足够了。附加费用。 所有即时应用程序模块必须为4MB或更小,因此即使无法下载整个应用程序,访问即时应用程序模块仍然是可行的选择。
- 提升位置和时间敏感型应用程序的吸引力。 虽然针对特定地点或活动而设计的应用程序不是一个新概念,但请问自己:我安装一个我知道只能在有限时间段内使用的应用程序的可能性有多大?某个位置? 即时应用程序通过允许用户点击URL即可访问您应用程序所有最重要的功能,从而可以增加对时间和位置敏感的应用程序的吸引力。
限制与限制
在开始即时应用之旅之前,值得注意的是,目前有一些即时应用无法完成的事情:
- 访问设备标识符,例如IMEI和MAC地址。
- 使用后台服务。
- 执行后台通知。
- 访问设备的外部存储。
- 访问已安装在用户设备上的应用程序列表,除非这些应用程序特别使自己可被即时应用程序发现。
此外,您的应用程序必须:
- 可从Google Play商店免费下载。
- 使用Android 6.0(API级别23)中引入的新权限模型。 由于用户未安装即时应用程序,因此没有机会提前请求权限。 如果您的即时应用程序功能模块需要访问敏感的设备功能或用户信息,那么您将需要在运行时请求这些权限。
- 支持应用链接。 这是用于将每个即时应用程序模块映射到特定URL的机制。 在下一篇文章中,我将详细介绍App Links。
最后,如果您的应用属于Designed for Families计划的一部分,则您不能将其作为即时应用提供。
设置您的开发环境
在创建具有即时应用程序支持的第一个项目之前,您需要安装以下内容或更高版本:
- Android Studio 3.0预览版
- Android SDK 6.0
- Android SDK构建工具26.x
- Android SDK工具25.x
- Android SDK平台工具25.x
您还应该确保拥有最新版本的Android支持库和Android存储库,因此请打开Android Studio的SDK Manager并安装所有可用的更新。
安装完上述所有内容后,就可以下载Instant Apps Development SDK:
- 打开“ SDK管理器”,然后选择“ SDK工具”选项卡。
- 选择Instant Apps Development SDK 。
- 点击应用 。
目前,您只能在运行Android 6.0或更高版本的Nexus 5X,Nexus 6P,Pixel,Pixel XL或Galaxy S7上测试即时应用。 但是,如果您不拥有这些设备中的任何一个,则可以在以下条件下创建一个模拟这些设备之一的Android虚拟设备(AVD):该AVD必须使用x86映像,并且必须包含Google API 。
由于我不拥有任何这些设备,因此我将创建一个模拟Pixel的AVD:
- 启动AVD管理器。
- 单击创建虚拟设备...按钮。
- 选择“ 像素” ,然后单击“ 下一步” 。
- 选择x86图像选项卡。
- 选择运行Android 6.0并包含Google API的系统映像,例如Marshmallow / 23 / x86 / Android 6.0(Google API) 。
- 单击下一步 。
- 为您的AVD命名,然后点击Finish 。
- 启动您的AVD。
最后,您需要在AVD上登录Google帐户:
- 切换到您的AVD,然后打开设备的启动器。
- 选择Google应用。
- 输入Gmail地址和密码。 这可以是您的真实帐户,也可以是仅为测试您的Android项目而创建的帐户。
创建您的第一个即时应用
在Android Studio 3.0 Preview 1及更高版本中,创建具有内置Instant App支持的项目就像选择一个复选框一样简单,因此,我们将创建一个Instant App项目,然后花费本文的其余部分将获得有关其各种组件的第一手经验。
请注意,该项目没有任何应用程序链接,因此您将无法在AVD上测试其Instant App组件(这是我们将在第二部分中详细探讨的内容)。
创建项目:
- 通过从Android Studio工具栏中选择“ 文件”>“新建”>“新建项目” ,或在Android Studio的“ 欢迎”屏幕中单击“ 启动新的Android Studio项目” ,启动项目创建向导。
- 为您的项目命名,然后单击“ 下一步” 。
- 将最低SDK设置为Android 6.0(棉花糖)。
- 选择包括Android Instant应用程序支持复选框,然后单击下一步 。
- 为了使事情变得简单,请接受默认的模块名称( 功能 ),然后单击“ 下一步” 。
- 选择基本活动 ,然后单击下一步 。
- 在下一个屏幕上,接受所有默认值,然后单击“ 完成” 。
马上,我们可以看到该项目的结构与典型的Android项目完全不同,并且由以下模块组成:
- 应用程式 可安装的应用程序模块,也称为APK模块。
- 基础。 基本功能模块。
- 特征。 尽管此特定项目只有一个,但一个应用程序可以包含多个功能模块。
- Instantapp。 即时应用模块。

除功能模块外,任何支持即时应用程序的项目都必须具有上述所有模块,因此让我们详细研究每个模块。
1.应用模块
应用程序模块的概念可能并不是什么新鲜事物,但是当您的项目支持即时应用程序时,应用程序模块的清单似乎比您以前习惯的要空得多:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jessicathornsby.myapplication.app" />
该文件之所以如此空是有原因的:构建项目时,整个基本要素和要素模块中所有其他清单文件的内容都会与此文件合并,因此不会永远保持空白!
如果打开此模块的build.gradle文件,则会注意到两个新元素:
dependencies {
implementation project(':feature')
implementation project(':base')
}
在这里,我们声明我们的应用程序模块依赖于feature
模块和base
模块。
当您将Instant App支持添加到项目时,您会将相关的代码和资源分离到功能模块中,这些功能模块可以独立于可安装的应用程序运行。 但是,这些模块仍然是可安装应用程序的一部分,而不是单独的实体,因此我们的应用程序模块将功能模块和基本模块声明为依赖项。
2.基本功能模块
每个即时应用程序项目都必须包含一个基本功能模块,该模块包含在所有应用程序模块中使用的代码和资源。 例如,如果打开项目的base / res / mipmap文件夹,则会看到该应用程序的所有启动器图标,这些图标显然将在多个模块中使用。
由于它包含通用代码和资源,因此您项目的所有功能模块都依赖于此单个基本功能模块。
延续这个主题,基本功能模块包含在整个项目中使用的清单条目。 例如,您项目的base / src / main / AndroidManifest.xml文件包含应用程序图标,主题和标签的设置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jessicathornsby.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
</manifest>
另一个值得注意的元素是基本模块的build.gradle文件,其中包含一些新属性:
//All base feature and “regular” feature modules use the com.android.feature plugin, rather than the com.android.application plugin//
apply plugin: 'com.android.feature'
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
//Specify that this is the project’s one and only base feature, using the ‘baseFeature true’ expression//
baseFeature true
…
…
…
dependencies {
//Use ‘application project’ to add a dependency from the base feature module, to your project’s installable ‘app’ module//
application project(':app')
//Use ‘feature project’ to reference our project’s feature module, aptly named ‘feature’//
feature project(':feature')
您还会注意到,这个特定的build.gradle文件缺少applicationID
属性,并且(扰流器警报)当您检查功能模块的build.gradle文件时,会发现完全一样的东西。 我们项目applicationID
仅在应用模块的的build.gradle文件中声明。
基本模块的build.gradle文件中的application project(
:
app)
行(请参见上文)可确保在所有 build.gradle文件中传播项目的单个applicationID
属性,这就是为什么我们其余部分都缺少此属性的原因项目。
3.功能模块
当您最终要向现有项目添加Instant App支持时,您的最大任务是将应用程序的每个功能提取到其自己的功能模块中,因为每个功能模块都包含仅提供此功能所需的代码和资源。
如果打开项目的功能模块,则会看到它包含MainActivity
类,以及activity_main和content_main资源文件-本质上是Basic Activity模板中包括的所有组件。

一个功能模块可以包含多个活动,但是每个模块必须至少具有一个指定为该模块的入口点活动的活动。
每个入口点活动都映射到特定的URL,因此,当用户点击此URL时,它将加载关联的活动,并且用户可以访问此特定功能模块。
您可以通过该模块的清单指定模块的入口点活动。 本质上,您需要打开此文件,并将以下内容添加到要用作入口点的“活动”中:
- 具有
CATEGORY_LAUNCHER
和ACTION_MAIN
意图的意图过滤器。 -
<data>
元素,包含有关您要映射到此入口点活动的URL的所有信息。 -
android:autoVerify
属性。 这告诉系统检查您的应用是否有权充当此特定URL的默认处理程序。 这是一种重要的安全机制,有助于保护网站所有者免受可能试图劫持其URL的恶意应用的侵害。
如果打开功能模块的清单文件,则会看到所有这些代码已添加到我们的MainActivity
声明中:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter android:order="1">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="jessicathornsby.com"
android:path="www.example.com/MainActivity"
android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
我们将在此模块中查看的最终文件是build.gradle文件,其中包含几行值得注意的代码:
//Again, we’re using com.android.feature plugin, rather than com.android.application//
apply plugin: 'com.android.feature'
android {
//As previously mentioned, this section is missing an ‘applicationID’ attribute//
…
…
…
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
//All feature modules have a dependency on the base feature module, which we’re declaring here//
implementation project(':base')
testImplementation 'junit:junit:4.12'
由于所有功能模块都依赖于基本功能模块,因此,当用户首次从您的应用程序请求任何功能时,他们将收到基本功能模块以及他们实际尝试访问的功能模块。
请注意,尽管此特定项目由基本功能模块和功能模块组成,但是如果您的应用仅具有一个您想作为Instant App提供的功能,则可以创建仅由基本功能模块组成的项目。 在整个系列中,我们将讨论Instant App项目的两种“类型”。
4.即时应用模块
Instant App模块的目的很简单:它充当一个容器,可以容纳您所有的功能模块并将其转换为Instant App APK。
如果打开该项目的Instant App模块,那么除了build.gradle文件外,它几乎是空的,该文件只是将基本功能模块和功能模块声明为依赖项:
apply plugin: 'com.android.instantapp'
dependencies {
implementation project(':feature')
implementation project(':base')
}
测试您的应用
由于该项目不包含任何应用程序链接,因此我们将无法测试其即时应用程序组件,但是我们仍然可以将该项目作为可安装的应用程序运行。 这似乎并不特别令人兴奋,但是请记住,我们项目的大部分代码和资源都位于即时应用程序功能模块中,因此测试我们的项目作为可安装应用程序的功能非常重要。
启动我们之前创建的AVD或将兼容的物理Android智能手机或平板电脑连接到您的开发计算机,然后从Android Studio工具栏中选择“运行”>“运行…”>“应用 ”。
尽管事实上我们所有的MainActivity
代码都位于功能模块中,但是一旦我们的应用加载,您将看到MainActivity
的浮动操作按钮(FAB)和Hello World消息。 我们在这里看到的是我们的应用程序模块,它获取位于单独的Instant App功能和基本功能模块中的代码和资源,并将它们组合为可安装的应用程序。
结论
在本教程中,我们对Instant Apps的工作原理进行了深入的研究,并探讨了您可能希望向Android项目中添加Instant App支持的各种原因。
在理想的情况下,您决定探索Instant Apps的决定与新的Android项目的开始完全吻合,但是不幸的是,成为开发人员很少这么方便! 这是更有可能的是,你必须重新配置现有的项目,以支持即时应用程序,这是不是很简单,因为选择Android Studio中的项目创建向导复选框!
在下一篇文章中,我们将深入研究如何向现有项目添加即时应用支持。 我还将向您展示如何实现App Links,因此,在下一篇文章结束时,您将创建一个功能齐全的Instant App,可以在任何兼容的AVD或Android设备上启动和测试。
翻译自: https://code.tutsplus.com/tutorials/what-are-android-instant-apps--cms-29283