Android即时应用程序:如何创buildURL可寻址模块?

Google最近更新了关于即时应用程序的信息页面: https : //developer.android.com/topic/instant-apps/prepare.html

除了“3.重构你的应用程序,如果有必要”,大多数的要点是清楚的。 他们build议零售模块,如浏览,search,项目的细节,和退房。

问:如何将应用程序分解为function完整和URL可寻址的模块? 我在这里看到几个问题: – 如果我们使用像dagger,butterknife这样的库,所有的模块都会依赖于其他模块 – 如果我们的模块包含(视图),如何转换到另一个视图)在没有导入这个模块的情况下被执

有人可以把光照到黑暗中吗? 谢谢!

Solutions Collecting From Web of "Android即时应用程序:如何创buildURL可寻址模块?"

正确使用Instant Apps所需的模块分离可以使用以下步骤轻松完成:

  1. 创build一个共享模块,其中将包含代码和资源,这些代码和资源应该在function模块中共享
  2. 为每个主要function创build几个function模块(在Google提供的示例中:浏览,search,项目详细信息和结帐)。 这些模块可以依赖于第1章中创build的共享模块,但它们彼此之间应该一无所知。
  3. 要从不同的模块开始一个活动,使目标活动可以通过URL进行寻址,并通过隐含的意图启动它。 谷歌build议使用应用程序链接。
  4. 要构build常规Android应用程序,请创build一个依赖于function模块的应用程序模块。
  5. 一旦Google向公众发布Android InstantApp SDK,您就可以构build您的即时应用程序(每个function一个)。

现在请参阅官方文档 ,即开发者通常可以使用Instant Apps。

总而言之,所有的即时应用程序都至less具有所谓的基本function模块,其中包含跨即时应用程序的通用代码。 最重要的是,Instant Apps可以有一个或多个依赖于基本function模块的附加function库。 虽然function模块本身不需要彼此依赖,但每个function模块都可以有自己的可以进行URL寻址的入口点。 如果需要调用另一个,可以通过基于URL的Intent完成。

来自docs网站的图表有点帮助:

在这里输入图像说明

所有的function模块都使用新的com.android.feature插件,与传统的com.android.library插件类似,在您的Android项目中如何使用它,因此库文档可以用作一个参考。 就它的不同而言,它将在与可安装的应用程序模块一起使用时输出常规的AAR文件,并在与新的即时应用程序模块一起使用时输出functionAPK。

考虑这个图。 在这里输入图像说明

问:如何将应用程序分解为function完整和URL可寻址的模块?

基本模块:包含您的应用程序所需的所有常用资源。 所以在我们的例子中,所有来自feature1和feature2的活动都将使用来自基本模块的共享资源。它可能有像匕首,刀子之类的库。

现在是时候将您的整个应用程序分解成一个称为function的较小单元。 一个function可能由多个活动组成,这些活动可能只是简要介绍一下您的应用,或者实现一个目标,这个目标可以促使用户安装该应用。 现在,它完全依靠你,你想要传递给用户的东西,坚持他们下载你的应用程序。

Feature1:所以我们已经把应用程序分成了feature1和feature2。 在这个function1中,我们给用户search和浏览项目。 无论何时用户点击物品,我们都需要加载来自物品2的物品细节,所以从浏览活动中点击物品我们会打电话

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://yourdomain.com/itemdetail")); intent.setPackage(getPackageName()); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent); 

因为:feature1中的Activity1不能直接调用feature2中的Activity2。 为此,您必须从activity1请求activity2的URL地址。

Feature2:现在,Feature2加载到即时应用程序,所以我们现在可以看到项目的细节活动。

注意:您还应该考虑您的function大小,同时拆分应用function,因为每个function不得超过4MB的大小,否则validation发生时,上传apk来玩商店。

我不确定我是否误解了你的问题,但是我会试着去解决这个问题。 对于我下面的解释,我会多次引用这个代码示例 。 我强烈build议克隆回购和玩它,因为我认为它会回答你的问题。

如果我们使用像匕首,刀叉之类的库,所有模块都将依赖于其他模块

正如其他人所提到的,所有function将使用的任何库都将进入您的基本function。

如果我们的模块根据需要包含(视图),那么如何在不导入该模块的情况下转换到另一个视图(来自另一个模块)?

这个答案涵盖了它的概述 – 但这部分似乎是你的问题的根源,所以我会试着深入一点。

假设Feature1( BrowseActivity )想要打开Feature2( ItemDetailActivity )。 而不是Feature1直接调用startActivity(ItemDetailActivity.class) ,它将不得不使用下面的方法调用(这是因为Feature1不能访问Feature2的ItemDetailActivity.class因为它们不依赖于对方)。 以下是Google提供的代码示例

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com/itemdetail")); intent.setPackage(getPackageName()); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent); 

现在缺less的部分是在Feature2的AndroidManifest您需要声明ItemDetailActivity正在侦听https://example.com/itemdetail链接。 以下是Google的相关代码示例

 <activity android:name=".ItemDetailActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:autoVerify="true"> <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" /> <data android:scheme="https" /> <data android:host="example.com" /> <!-- IMPORTANT --> <data android:pathPrefix="/itemdetail"/> </intent-filter> <meta-data android:name="default-url" android:value="https://www.example.com/itemdetail" /> </activity> 

有关更多信息,请阅读数字资产链接以及一般深层链接

我认为function模块想出了一切应该模块化的概念。 最后,每个function都可以分解成function模块。

我从这次演讲开始了解项目结构的新方法。 这让我清楚一点。

如果我们创buildfunction模块并想链接到function模块,我们可能需要删除未使用的androidTest test和资源。

在这里创build一个新结构的简单项目

在这个版本中,尝试从头开始,从以下文档开始,从应用程序模块更改为特性模块,并将即时应用程序模块添加到代码库中。