使用ARouter进行Android模块化开发,详解系列文章
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
…
// No problem! hand over control to the framework
callback.onContinue(postcard);
// Interrupt routing process
// callback.onInterrupt(new RuntimeException(“Something exception”));
// The above two types need to call at least one of them, otherwise it will not continue routing
}
@Override
public void init(Context context) {
// Interceptor initialization, this method will be called when sdk is initialized, it will only be called once
}
}
降级策略
ARouter提供的降级策略主要有两种方式,一种是通过回调的方式;一种是提供服务接口的方式。
一、回调方式
这种方式在跳转失败的时候会回调NavCallback接口的onLost方法。ARouter提供的回调方式的函数如下:
ARouter.getInstance().build(MainRoutePath.MAIN_ACTIVITY).navigation(this, new NavCallback() {
@Override
public void onFound(Postcard postcard) {
Log.d(“ARouter”, “找到了”);
}
@Override
public void onLost(Postcard postcard) {
Log.d(“ARouter”, “找不到了”);
}
@Override
public void onArrival(Postcard postcard) {
Log.d(“ARouter”, “跳转完了”);
}
@Override
public void onInterrupt(Postcard postcard) {
Log.d(“ARouter”, “被拦截了”);
}
});
二、服务接口
全局降级-服务接口的方式主要处理逻辑在内部,暴露的接口很友好。
ARouter.getInstance().build("/test/test").navigation();
此种降级策略需要实现服务接口DegradeService,返回的就一个方法就是onLost。例如:
@Route(path = RoutePath.DEGRADE)
public class DegradeServiceImpl implements DegradeService {
@Override
public void onLost(Context context, Postcard postcard) {
ARouter.getInstance().build(RoutePath.DEGRADE_TIP).greenChannel().navigation();
}
@Override
public void init(Context context) {
}
}
混淆
为了避免打包时出现错误,需要将下面的内容使用keep标示。
-keep public class com.alibaba.android.arouter.routes.{*;}
-keep public class com.alibaba.android.arouter.facade.{;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{;}
如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
-keep class * implements com.alibaba.android.arouter.facade.template.IProvider
ARouter Helper,
在 Android Studio 插件市场中搜索 ARouter Helper, 或者直接下载文档上方 最新版本 中列出的 arouter-idea-plugin zip 安装包手动安装,安装后 插件无任何设置,可以在跳转代码的行首找到一个图标 (navigation) 点击该图标,即可跳转到标识了代码中路径的目标类。
ARouter模块化示例
接下来,将会用一个demo介绍如何用ARouter进行模块化开发,demo模块化的整体架构如下图所示。
每个模块的作用如下:
- app:项目的宿主模块,仅仅是一个空壳,依赖于其他模块,成为项目架构的入口;
- baselibrary:项目的基类库,每个子模块都依赖共享公用的类和资源,防止公用的功能在不同的模块中有多个实现方式;
- module_route:集中管理所有模块的route的库;
- module_main:闪屏页,登录页,主页等;
- module_home:首页模块;
- module_video:视频模块;
- module_mine:我的模块;
依赖模式与独立模式的切换
使用模块化开发的一个好处是,各个独立的模块可以同时开发,独立运行而不必依赖于宿主app,也就是每个module是一个独立的App,项目发布的时候依赖到宿主App中即可。各业务模块之间不允许存在相互依赖关系,但是需要依赖基类库。
并且,单一模块生成的apk体积也小,编译时间也快,开发效率会高很多,同时也可以独立测试,要实现这样的效果需要对项目做一些配置。
gradle.properties配置
在主项目的gradle.properties中需要设置一个开关,用来控制module的编译模式,例如:
isModule=false
当isModule为false时作为依赖库,只能以宿主app启动项目,选择运行模块时其他module前都是红色的X,表示无法运行。
当isModule为true时,作为单独的模块进行运行,选择其中一个具体的module就可以直接运行。
module清单文件
为了完成依赖模式与独立模式的切换,module清单文件需要配置两个,一个作为独立项目的清单文件,一个作为库的清单文件,以module_main模块为例。
buildApp作为依赖库的清单文件,和独立项目的清单文件buildModule区别是依赖库的清单文件Application中没有配置入口的Activity,其他都一样。
gradle配置
为了完成切换,还需要对module的build.gradle文件进行配置,如下图:
宿主app配置
接下来,在宿主app的build.gradle中添加模块依赖,如下所示:
dependencies {
if (!isModule.toBoolean()) {
implementation project(’:module_home’)
implementation project(’:module_video’)
implementation project(’:module_main’)
implementation project(’:module_mine’)
implementation project(’:module_router’)
}
}
ARouter Helper
常见问题
问题1
错误:ARouter::Compiler >>> No module name, for more information, look at gradle log.
检查项目依赖的全部module,包括module依赖的module,为了能够进行单独的编译,所以需要为每一个module添加名称,即在每个module的 build.gradle中加上下面的代码:
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ AROUTER_MODULE_NAME : project.getName() ]
}
}
}
新的开始
改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。
如果有需要进阶Android高级工程师系统学习资料的,我可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。
《系列学习视频》
《系列学习文档》
《我的大厂面试之旅》
)】。**
《系列学习视频》
[外链图片转存中…(img-WqP5pkJ7-1646562675640)]
《系列学习文档》
[外链图片转存中…(img-Hs52dtBk-1646562675641)]
《我的大厂面试之旅》
[外链图片转存中…(img-IetR8TZX-1646562675642)]
使用ARouter进行Android模块化开发,详解系列文章相关推荐
- 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...
本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...
- JMessage Android 端开发详解
JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...
- 《Android游戏开发详解》一2.16 区分类和对象
本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...
- 《Android游戏开发详解》一3.1 构造方法
本节书摘来异步社区<Android游戏开发详解>一书中的第3章,第3.1节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...
- 《Android游戏开发详解》一导读
前 言 Android游戏开发详解 作为对编程知之甚少或者毫无所知的初学者,开始学习Android游戏开发,可能会觉得就像是穿越陌生的星际的旅程.有太多的事情要尝试,太多的知识要学习,令人遗憾的是,还 ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- 《Android游戏开发详解》——第3章,第3.1节构造方法
本节书摘来自异步社区<Android游戏开发详解>一书中的第3章,第3.1节构造方法,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区& ...
- 《Android游戏开发详解》一2.18 使用Java API中的对象
本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.18节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.1 ...
- 《Android游戏开发详解》——第2章,第2.10节使用对象
本节书摘来自异步社区<Android游戏开发详解>一书中的第2章,第2.10节使用对象,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区 ...
- 《Android游戏开发详解》一2.2 设置开发机器
本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.2节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...
最新文章
- 【CCNA考试】2010-06-29-北京-987(PASS)
- listview条目用状态选择器没反应
- 【杂谈】如何让你的2020年秋招CV项目经历更加硬核,可深入学习有三秋季划4大领域32个方向(2020.7.23号后涨价)
- Git的reflog与log
- 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
- linux下bios设置内存电压,系统安装的BIOS设置?
- 微信公众帐号开发教程第11篇-符号表情的发送(上)
- 基于python的测试报告自动化生成
- TENER: Adapting Transformer Encoder for Name Entity Recognition
- 进击的UI------------UIToolBar(bottom导航条)
- 使用HandBrake的视频压制及投稿教程
- mysql中like与rlike_Hive中rlike,like,notlike区别及使用
- Android登录界面用SharedPreferences实现记住密码功能
- 百分点认知智能实验室:如何打造工业级的机器翻译
- 我想知道怎么提升csgo枪法
- 使用alwayson后如何收缩数据库日志
- C语言零基础入门(一 简介)
- 51job爬虫-xpath
- 算法笔记CodeUp第一至第六章刷题记录
- 漫画 | 平时的你 vs 面试时的你
热门文章
- 网关短信 群发 为什么卡发短信 群发 贵 ?
- PerformanceManagementSystem
- 微商如何通过自媒体平台进行引流
- 【译学】数据分析手册学习01: 导言、学习目标、指导原则
- 计算机win7卡顿如何解决方法,win7电脑玩2D游戏经常发生卡顿六大解决方法
- Lua Busted 单元测试简介(Windows 环境)
- Vue在线编译器:vue-running
- 【转】走火大神说:去年这时候又辞退了一个老油条,不知道他现在是否在开公司了,可以对比一下混工资的水平...
- ecu根据什么信号对点火提前角_刷ECU能让发动机秒变高功?工程师:你还太年轻...
- 标准化考场时钟系统方案