博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Navigation + Dynamic Feature Module 实现模块化
阅读量:3702 次
发布时间:2019-05-21

本文共 2189 字,大约阅读时间需要 7 分钟。

androidx navigation 2.3.0 加入了对 dynamic feature module 的导航支持,因此我们利用这个来分离出多个功能 module 来实现模块化

navigation 2.3.0 更新

国内基本不用的 dynamic feature module

是官方 18 年推出的动态发布方案,类似国内各种插件化方案。不过它需要 Google Play Store 支持,这导致在国内无法使用

借着 navigation 组件支持 dynamic feature module 间导航的契机,我们可以使用 dynamic feature module 来拆分功能模块以实现模块化

传统的拆分方案大概是这样,feature module 之间相互隔离,app module 依赖各个 feature module 间接依赖 base 库,公共库

传统架构

而使用 dynamic feature module ,其结构是这样的

dynamic feature 架构

dynamic feature module 也可以按需安装,也就是说,它们可能不包含在用户最初下载的 APK 中,而是在运行时安装。而我们可以直接将它们包含到 APK 中

使用 dynamic feature module

首先我们在 base lib 中引入依赖

dependencies {    def nav_version = "2.3.0-alpha06"    api "androidx.navigation:navigation-fragment-ktx:$nav_version"    api "androidx.navigation:navigation-ui-ktx:$nav_version"    api "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"}

我们在 app module 中的 res/navigation 目录下创建 main_nav.xml

main_nav.xml

接着我们在 activity_main 中设置默认的 host

默认 host

这里不同于正常 navigation 的用法,没有使用 NavHostFragment,而是使用 DynamicNavHostFragment

直接跳转 fragment

我们创建 dynamic feature module ,取名为 feature1

创建 dynamic feature module

创建 dynamic feature module

包名前部分需保证与 applicationId 相同

包名前部分需保证与 applicationId 相同

这里
dynamic feature module
的包名前部分要和 applicationId 即 app module 包名相同,否则后续的 include 操作会有问题

选择加载模式

这里我们选择在安装时集成该 module

接着我们在该 module 下创建一个 fragment 取名为 Feature1OneFragment

之后我们直接在 main_nav.xml 中引入 该 fragment 并加入 action

直接引入 fragment

接着我们就可以在 app 下的 MainFragment 打开 Feature1OneFragment

启动 fragment

 

我的 demo 中 feature2 是直接引入 fragment,因此跳转的是 Feature2OneFragment

直接跳转 activity

在 feature1 中创建 activity (demo 中为 feature2)

跳转 activity

同样需要指定 moduleName

启动activity

使用 dynamic feature module 内部的 graph

我们可以为 dynamic feature module 单独配置 navigation graph,这样就可以处理 dynamic feature module 内部的跳转了

在 feature1 中创建 feature1_nav.xml ,其中 startDestination 为 Feature1OneFragment

feature1_nav.xml

在 main_nav.xml 我们需要使用另外一种方式来使用该 graph

include-dynamic

include-dynamic

我们使用了一个新的标签 include-dynamic,同时我们看到了几个没用过的属性

  • graphPackagedynamic feature module 的包名

  • graphResNamedynamic feature module 内部 graph 的名字

  • moduleName 为 module 名

注意:这里的 graphPackage 可以省略
  1. 如果 module 的包名没用按照前文的格式配置会导致无法找到 graphId 的异常

  2. include-dynamic 标签的 id 要与 feature1_nav.xml navigation 标签下的 id 一致,或者后者不设置 id

这样从 app module 导航到 feature1 的 startDestination 后便可使用其内部的逻辑进行后续的导航了

include 跳转

feature module 间跳转

暂不支持 deep link

Navigation 组件暂不支持 Dynamic include graph 的 deep link

因此我目前也没有找到特别优雅的方式,已知的方案如下

  • 反射

  • 使用

  • 使用依赖注入

 

转载地址:http://jcocn.baihongyu.com/

你可能感兴趣的文章
计算机组成原理总结
查看>>
1.3 QT界面美化
查看>>
2 QT数据传输(MVC)
查看>>
3.QT逻辑交互(信号槽)
查看>>
4 QT功能模块
查看>>
(4)功能模块(文件)
查看>>
@Component 和 @Bean 的区别
查看>>
jmeter模拟不同ip对接口进行请求访问
查看>>
javaWeb从入门到放弃——Http基础知识
查看>>
依赖注入
查看>>
Springboot 自动装配原理2
查看>>
Springboot 自动装配原理1
查看>>
Springboot 自动装配流程图详解
查看>>
Springboot 整合mybatis
查看>>
Springboot+mongodb本地环境正常,生产环境报错{java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions}
查看>>
你真的知道get方法与post方法的区别吗?论get方法与post方法上传下载文件的区别
查看>>
swagger配置及升级版swagger-bootstrap-ui配置+访问账号密码登录限制
查看>>
网易云Api,轻松获取音乐数据
查看>>
List与String相互转换
查看>>
阿里巴巴fastjson api使用教程
查看>>