动手撸一个Android路由框架LuRouter

背景

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:
<service name="attention_user" class=".RouterService.AttentionServiceImpl" />
  • ok,我们在需要调用关注接口的地方这样使用:
Router.getService("mine", "attention_user",IAttentionService.class).attention(gid, 1)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章