android 开发中路由,GitHub - safe-ending/AtRouter: android路由模块化开发

Arouter组件路由的应用

框架初解

**实现原理:**路由控制跳转,用到阿里开源的Arouter框架,从外部URL映射到内部页面,以及参数传递与解析跨模块页面跳转,模块间解耦,拦截跳转过程,处理登陆、埋点等逻辑,跨模块API调用,通过控制反转来做组件解耦

本框架实现基于Rxjava2+Okhttp3.9.0+Retrofit2.3.0+DataBinding的 MVVM模式

项目组成介绍:

基础模块用lib_开头命名

组件模块用module_组件名命名

项目通过version.grade统一控制依赖版本,在project的build.gradle中加入引用

apply from: 'versions.gradle'

addRepos(repositories)

模块介绍

项目划分为基础模块和业务模块,业务模块代码功能相互独立。

基础模块:

lib_opensource->项目的依赖包,其中只管理项目的依赖,将在version.gradle中配置好版本的第三方依赖在lib_opensource/build.gradle中进行引入,所有的业务模块都需要依赖于它。

lib_common->封装好的各种Base基类(Application、Activity、Fragment、Model...)以及常规工具类(xxxUtils等)和项目组建公用的一些weight(自定义View、自定义组建等)、自定义监听器、自定义回调方法、数据库(sharepreference、database...)

lib_coremodel->网络请求模块,此中包含网络所需的部分工具类和请求主类。不同模块的请求实体类需要放在com.at.arouter.coremodel.http.entities下面,通过继承AndroidViewModel的com.at.arouter.coremodel.viewmodel.AndroidViewModel来处理网络请求结果,将请求的数据绑定在Activity/Fragment的生命周期上。

业务模块

module_girls->测试模块,放了几张图片提神。

module_third->工单模块,目前引入的界面是钱包的设计图样式,接口用的交易所接口。

在工程根目录下的gradle.properties文件中加入一个Boolean类型的变量,通过修改这个变量来识别编译模式:

每次更改“isModule”的值后,需要点击 "Sync Project" 按钮isModule是“集成开发模式”和“组件开发模式”的切换开关

isModule=false

然后在 module_girls和module_news中的build.gradle文件中支持切换:

if (isModule.toBoolean()) {

//组件化编译时为application

apply plugin: 'com.android.application'

} else {

//非组件化编译时为library

apply plugin: 'com.android.library'

}

..

sourceSets {

main {

if (isModule.toBoolean()) {

//组件化编译时为app,在对应的AndroidManifest文件中需要写ndroid.intent.action.MAIN入口Activity

manifest.srcFile 'src/main/module/AndroidManifest.xml'

} else {

manifest.srcFile 'src/main/AndroidManifest.xml'

//集成开发模式下排除debug文件夹中的所有Java文件

java {

//debug文件夹中放的是Application类,非组件化时不用有此类

exclude 'debug/**'

}

}

}

}

}

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

api project(':lib_coremodel')

api project(':lib_common')

implementation 'com.android.support:support-v4:26.1.0'

annotationProcessor deps.arouter.compiler

}

各个module或lib下需要添加混淆

-keep public class com.alibaba.android.arouter.routes.**{*;}

-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

避免release下的打包后项目构建的异常错误,其余的各模块下的混淆也可单独在各模块写入,最后在主项目中进行一个汇总

项目应用

目前接入的测试模块module_girls和工单模块module_third是可运行的,新建立的模块以module_(模块简称)命名,在build.gradle中对lib_common和lib_coremodel模块进行引用就可以进行开发。

模块跳转:

//组件化

case R.id.btWork:

ARouter.getInstance().build(ARouterPath.WorkListAty).navigation(MainActivity.this);

break;

模块的迁移注意事项:

1、Activity/Fragment界面需要添加路由注解如:

@Route(path = ARouterPath.GirlsListAty)

2、传值处理

传值-》

ARouter.getInstance()

.build(ARouterPath.DynaGirlsListAty)

.withString("fullUrl", "http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/1")

.withTransition(R.anim.activity_up_in, R.anim.activity_up_out)

.navigation(ActivityGirls.this, 3);

接收-》

@Autowired(name = "fullUrl")//添加注解

public String fullUrl;

//inject需要注入后才可以读取到携带过来的参数

ARouter.getInstance().inject(this);

3、请求示例

//获取retrofit对象

Observable> observer = APIManager.buildAPI(APIHostManager.Common_Url,UserService.class).login(mBinding.tvUserName.getText(), mBinding.tvPwd.getText());

//获取ViewModel对象

CommonViewModel viewModel = ViewModelProviders.of(LoginActivity.this).get(CommonViewModel.class);

//调用下面的request请求方法

viewModel.request(this,null, observer, new ObserverCallback() {

@Override

public void success(UserModel userModel) {

//成功返回

}

@Override

public void failure(Throwable e) {

//错误返回-其中的错误提示已经展示服务器提示,特殊错误如500会提示网络不稳定

dismissDialog();

}

});

4、状态页面属性配置

于lib_common下的LoadingCallback中修改加载样式(如需修改必须改),此处主要是在BaseApplication下的Lodsir初始化用到。

//以下为公共回调类

于lib_coremodel下的LoadingCallback中修改加载样式(和上面同步就行)

于lib_coremodel下的其他callback中修改对应样式(和上面同步就行)

新模块需要配置的地方:

1、build.gradle可以直接复制工单模块中的build.gradle的文件

2、在src/main/下面添加module目录,并在下面添加AndroidManifest.xml文件,这个配置文件为模块单独运行时(debug)所需要,当项目被整体打包时会调用模块本身的AndroidManifest.xml,所以这俩个文件中都需要对各个Activity和权限以及其他的一些配置进行注册.

3、在src/java/下添加debug目录,添加集成BaseApplication的Applictaion,并在module/AndroidManifest.xml下引用,用于模块单独运行(debug)时的一些第三方的初始化。在这个里面需要注意添加以下代码:

if (Utils.isAppDebug()) {

//开启InstantRun之后,一定要在ARouter.init之前调用openDebug

ARouter.openDebug();

ARouter.openLog();

}

ARouter.init(this);

最终要记得主项目中的Applition也加入这些初始化。

4、对应的value/colors、value/string是可以直接添加在对应模块下的,语言切换时可以读取到下面的中英文值,不同模块colors下的重复名也没有影响(已测);其余的文件(styles等...)待测。

资源重复问题尽量不要相同,用一下resourcePrefix "前缀_"方法处理

android {

compileSdkVersion 28

resourcePrefix "me_"

defaultConfig {

minSdkVersion 15

targetSdkVersion 28

versionCode 1

versionName "1.0"

}

}

5、Activity/Fragment需要添加路由注解如:

@Route(path = ARouterPath.GirlsListAty)

模块可以单独进行运行,不需要编译整个项目,在android studio的Edit Congfigurations进行模块切换就可运行。

项目进阶

1、还需要对已有和将来复用公用的工具类以及网络请求模式进行优化、提取。

2、对不同项目的应用可以采取主题风格化配置,在不改变样式的情况下只改变主题的颜色,就可以实现快速切换主题。

3、其余的问题查阅项目下《支持文档》目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值