Android模块化开发已经非常普遍了,尤其在大中型项目中,模块化的优势相当明显,多人协作开发、各模块独立运行、独立测试等等。但是模块间页面跳转让人很是头疼,如果采用原生路由方案,会让各模块间严重耦合依赖,就完全违背了模块化的初衷,为了解决这个问题,需要我们自行设计一套路由框架。下面给大家介绍一下我的路由框架LuRouter。
app是宿主工程,主要功能是通过集成整合其它module,最终形成我们的app。
宿主app依赖于home、community和mine三个module,这三个module又分别都依赖于assets(用于存放图片、字符串等公共资源)和utils(用于存放各种依赖库和工具类等)。
我采取的方式是在每个module的assets文件夹下新建一个以“bundle.xml”结尾的XML文件,这个文件就是“路由表”,然后把各个module中需要让外界调用的Activity、fragment和接口等都在此进行唯一注册,app启动时在application中将所有module下的路由表解析并统一保存在Router中,在使用时各个module之间就可以通过注册时的信息进行调用跳转啦!思想很简单清晰,下面看看如何使用。
就是一个普通的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之间实现接口回调等。
public class RouterAppliction extends Application {
@Override
public void onCreate() {
super.onCreate();
Router.init(getApplicationContext());
}
}
在宿主app下appliction类的onCreate方法中对Router进行初始化,将各个module下的“路由表”中的内容都解析出来,按照name和url分别存储在moduleMap和moduleUrlMap中。
在解析“路由表”时我们存储了两个map,所以在调用时也有两种调用方式。
“module名+类别名”方式
fragment = Router.createFragment(context, “home”, “homefragment”, null);
这里以fragment为例,调用Router的createFragment方法,依次传入上下文、在路由表中注册的module名、类别名、需要传递的参数等。Activity和接口sercice均有类似方法可以调用。
openurl方式
Router.invokeUrl(context, open_url);
调用Router的invokeUrl方法,参数是上下文和对应的openurl。
这里的service不是我们通常说的服务,它是为解决各个module之间的方法调用而设计的。
举个例子,有这样一个应用场景,很多App中都会有关注用户的功能,点击关注按钮需要调用网络接口告知后台,后台返回给我们关注操作成功与否,拿到结果后修改相应的UI,而这个功能可能会出现在各个模块中,我们在每个模块都把这个网络请求写一遍,会让人感觉很臃肿,这个时候就可以用接口service来处理啦!
public interface IAttentionService {
void attention(String id, int isAttention);
}
public class AttentionServiceImpl implements IAttentionService {
@Override
public void attention(String id, int isAttention) {
//进行网络请求
}
}
Router.getService("mine", "attention_user",IAttentionService.class).attention(gid, 1)
到这里LuRouter的基本原理和使用方法已经讲完了,大家还可以在这个基础上继续扩展,有什么问题欢迎提出!
github链接:https://github.com/kb18519142009/LuRouter
欢迎star~