具有即时/(动态)功能模块的导航组件

时间:2019-04-05 09:52:14

标签: android android-intent android-architecture-components android-instant-apps android-architecture-navigation

我正在尝试实现具有动态功能的 new 导航组件

所以结构看起来像这样:

  • 应用程序(gradle中包含动态dynamicFeatures = []
  • 功能

    • 登录
  • 库-> globalNav

我一直在阅读很多没有成功的方法,因为如何将它们粘合在一起而不相互依赖,因为每个功能都是完全独立的

例如应用(app module)SplashActivity开始并检查会话状态,所以我的问题是我应该如何启动login_graph或{{1 }},在第一种情况下,完成身份验证流程后就开始家庭吗?

我目前尝试将它们粘合在一起的方式是使用home_graph模块(android-library),我发现了一些解决方法:

  • 完整的类路径,这意味着我从className开始意图(不好,因为它不是真正可扩展的,并且使维护PITA成为可能)
globalNav
  • 深层链接(我想用作导航图的深层链接已包含那些链接),但由于某些原因,即使只有我的应用程序使用它,它仍始终显示“选择完整操作”选择器。

    • 我已经尝试使用Intent().setClassName(context.packageName, className).also { context.startActivity(it) } ,但行为与Deeplinks相同

任何建议都会很棒:)


PS:我一直在浏览/阅读的一些参考文献:

PSS:如果我找到一个好的解决方案,我会尽力解决这个问题,我也将确保也回答。

编辑

对于对此感兴趣的任何人(目前不支持此问题),您可以在此处加注星标:https://issuetracker.google.com/issues/132170186

3 个答案:

答案 0 :(得分:3)

我们正在积极支持动态功能模块的导航。正如Joaquim所说,this isse是寻找初期开发进度的地方。

您可以通过今天将SNAPSHOT添加到build.gradle文件中来使用它:

repositories {
  maven {
    url "https://ci.android.com/builds/submitted/5956592/androidx_snapshot/latest/repository/"
  }
}
dependencies {
  implementation "androidx.navigation:navigation-dynamic-features-fragment:2.3.0-SNAPSHOT"
}

这不是一个稳定的版本,在稳定发行之前可能会有更改。此时,该库上也没有公共文档。随着我们的前进,我将更新这个问题。

与此同时,您也可以观看recording on this from the Android Dev Summit 2019

答案 1 :(得分:1)

androidx.navigation:navigation-dynamic-features-fragment:2.3.0现在支持此功能。

只需在导航中包含app:moduleName

示例:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/menu_nav_graph"
    app:startDestination="@id/main_fragment">

<!-- this fragment is in base module -->
<fragment
        android:id="@+id/main_fragment"
        android:name="com.example.app.MainFragment"
        tools:layout="@layout/fragment_main" />

<!-- activity and fragment in a different module -->
<activity
        android:id="@+id/splash_activity"
        android:name="com.example.examplemodule.splash.SplashActivity"
        app:moduleName="examplemodule" />

<fragment
        android:id="@+id/user_profile"
        android:name="com.example.examplemodule.user.UserProfileFragment"
        android:label="UserProfileFragment"
        app:moduleName="examplemodule" />

</navigation>

您可以从任何地方致电findNavController().navigate(R.id.splash_activity),并且会在必要时为您安装examplemodule

答案 2 :(得分:0)

几分钟前,我也遇到了同样的问题,在尝试寻找答案时,我看到了您的问题。

就我而言,我有2个模块 app 登录登录模块是动态功能模块,取决于模块 app 登录模块包含用于登录目的的所有逻辑和导航(包含登录,注册等)。我想将此LoginActivity(这是登录模块中的一个活动,其中包含所有导航功能)包含在应用程序模块的主导航图中。我们无法从它不知道的应用程序层调用LoginActivity。但是

<activity android:id="@+id/loginActivity"
    android:name="login.LoginActivity"
    android:label="LoginActivity"/>

将其手动添加到主导航图中对我来说很有效。