背景

Android模块化开发已经非常普遍了,尤其在大中型项目中,模块化的优势相当明显,多人协作开发、各模块独立运行、独立测试等等。但是模块间页面跳转让人很是头疼,如果采用原生路由方案,会让各模块间严重耦合依赖,就完全违背了模块化的初衷,为了解决这个问题,需要我们自行设计一套路由框架。下面给大家介绍一下我的路由框架LuRouter。

一、整体结构

1、包结构

app是宿主工程,主要功能是通过集成整合其它module,最终形成我们的app。

2、依赖关系


宿主app依赖于home、community和mine三个module,这三个module又分别都依赖于assets(用于存放图片、字符串等公共资源)和utils(用于存放各种依赖库和工具类等)。

二、原理解析

我采取的方式是在每个module的assets文件夹下新建一个以“bundle.xml”结尾的XML文件,这个文件就是“路由表”,然后把各个module中需要让外界调用的Activity、fragment和接口等都在此进行唯一注册,app启动时在application中将所有module下的路由表解析并统一保存在Router中,在使用时各个module之间就可以通过注册时的信息进行调用跳转啦!思想很简单清晰,下面看看如何使用。

三、使用方法

1、路由表结构:


就是一个普通的XML文件,解析过程也很简单。最外层是module节点,参数name为该module唯一别名,package为包名;
子节点有fragment、activity和service等,参数name为该类唯一别字,class为该类的路径,url是与服务端约定后制定好的打开该类的openurl,各个类之间不可相同,同一个类可以有多个openurl,用逗号隔开

url="/goto/news_detail,/goto/video_detail,/goto/photo_detail"

fragment和activity节点下支持子节点arg,即想要传入的参数,name代表key值,type代表参数类型,支持string、integer、boolean等;
service节点代表接口,可在各module之间实现接口回调等。

2、初始化

public class RouterAppliction extends Application {    @Override    public void onCreate() {        super.onCreate();        Router.init(getApplicationContext());    }}

在宿主app下appliction类的onCreate方法中对Router进行初始化,将各个module下的“路由表”中的内容都解析出来,按照name和url分别存储在moduleMap和moduleUrlMap中。

3、调用

在解析“路由表”时我们存储了两个map,所以在调用时也有两种调用方式。
“module名+类别名”方式

fragment = Router.createFragment(context, “home”, “homefragment”, null);

这里以fragment为例,调用Router的createFragment方法,依次传入上下文、在路由表中注册的module名、类别名、需要传递的参数等。Activity和接口sercice均有类似方法可以调用。

openurl方式

Router.invokeUrl(context, open_url);

调用Router的invokeUrl方法,参数是上下文和对应的openurl。

4、接口service的用法

这里的service不是我们通常说的服务,它是为解决各个module之间的方法调用而设计的。

举个例子,有这样一个应用场景,很多App中都会有关注用户的功能,点击关注按钮需要调用网络接口告知后台,后台返回给我们关注操作成功与否,拿到结果后修改相应的UI,而这个功能可能会出现在各个模块中,我们在每个模块都把这个网络请求写一遍,会让人感觉很臃肿,这个时候就可以用接口service来处理啦!

  • 首先,我们在所有module都依赖的utils中定义接口IAttentionService:
public interface IAttentionService {    void attention(String id, int isAttention);}
  • 接着在mine模块中实现该接口,在attention方法中去进行网络请求:
public class AttentionServiceImpl implements IAttentionService {    @Override    public void attention(String id, int isAttention) {//进行网络请求    }}
  • 最后,在mine模块的"bundle.xml"文件即“路由表”中注册该service:
  • ok,我们在需要调用关注接口的地方这样使用:
Router.getService("mine", "attention_user",IAttentionService.class).attention(gid, 1)

到这里LuRouter的基本原理和使用方法已经讲完了,大家还可以在这个基础上继续扩展,有什么问题欢迎提出!
github链接:https://github.com/kb18519142009/LuRouter
欢迎star~

更多相关文章

  1. 如何在App中实现IM功能之三快速实现离线消息推送模块――箭扣科
  2. Android:调用系统图库/裁剪图片
  3. Android(安卓)& Linux的suspent和resume执行流程
  4. 第一行代码笔记3
  5. 简述Unity中调用Android方法
  6. Android(安卓)Ashmem相关介绍
  7. 【Android自定义View】 仿照腾讯漫画自定义Toast的实现
  8. android listview为什么会执行很多次,频繁调用getview
  9. [置顶] Android中调用系统相机、系统相册来获取图片,并裁剪图片。

随机推荐

  1. 如何让百度收录我们自己的网站呢?
  2. vscode编辑器和插件安装及markdown语法熟
  3. SwiftUI - 百行代码变十行,Swift再创辉煌!
  4. Kubernetes 运维学习笔记
  5. Linux下smokeping网络监控环境部署记录
  6. Gitblit版本服务器环境部署记录
  7. Stimulsoft Reports如何进行数据连接?
  8. LVS+Keepalived 高可用环境部署记录(主主
  9. LVM常规操作记录梳理 [扩容、缩容、快照
  10. Centos下内网DNS主从环境部署记录