Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked from HCDarren/DRouter

Android 平台多模块多组件开发的路由库

Notifications You must be signed in to change notification settings

prpr894/DRouter

Repository files navigation

Android 平台多模块多组件开发的路由库

一. DRouter 基本介绍

1. 该库所涉及到的类大概在 30 个左右,源码并不多相信我们都能读懂里面的内容,这里罗列一下源码中所涉及到的一些知识点:

(1) 编译时注解自动生成 Module、Action 和 Intercepter

(2) 线程、线程池、线程同步异步和 Handler

(3) 责任链模式、享元模式、策略模式、模板模式 ...

2. 作为一个多模块的路由通信库,相信它已支持了所有跨模块通信的使用场景,功能介绍如下:

(1) 支持依赖注入,可单独作为依赖注入框架使用

(2) 支持线程切换和调度(原始线程,主线程,同步,异步)

(3) 支持多模块工程下的所有跨模块通信使用场景

(4) 支持添加多个拦截器,可根据优先级自定义拦截顺序

(5) 支持权限和网络检测、登录拦截跳转和数据埋点等功能

3. 笔者阅读了大量的开源库源码,本库的所有代码思想都来自其中,很感激这些大牛的开源和分享精神:

(1) ARouter

(2) butterknife

(3) okhttp

(4) EventBus

(5) RxJava

(6) retrofit

二. DRouter 基本使用

  1. 在需要跨模块通信的Module中添加依赖和配置
 defaultConfig {
 ......
 javaCompileOptions {
 annotationProcessorOptions {
 arguments = [moduleName: project.getName()]
 }
 }
 }
 dependencies {
 .......
 annotationProcessor project(':drouter-compiler')
 }
  1. 初始化 SDK
public class BaseApplication extends Application{
 @Override
 public void onCreate() {
 super.onCreate();
 // 开启 debug
 DRouter.openDebug();
 // 初始化且只能初始化一次,参数必须是 Application
 DRouter.getInstance().init(this);
 }
}
  1. 在 Module 中创建需要执行的 Action
// path 必须是以在 gradle 中配置的 moduleName + "/" 开头,否则编译通不过。
// threadMode 支持 POSTING 、MAIN、BACKGROUND、ASYNC 默认情况下是 POSTING(原始线程)
@Action(path = "login/action", threadMode = ThreadMode.MAIN)
public class LoginAction implements IRouterAction {
 @Override
 public RouterResult invokeAction(Context context, Map<String, Object> requestData) {
 // 通信执行方法支持所有场景,启动 Activity,Service,Provider,弹框,缓存数据,获取 Fragment 等等等等
 Intent intent = new Intent(context, LoginActivity.class);
 intent.putExtra("key", (String) requestData.get("key"));
 context.startActivity(intent);
 return new RouterResult.Builder().success().object(100).build();
 }
}
  1. 可在任意 Module 中执行跳转
// 根据 action 查询只执行对应方法,不处理返回回调,参数携带随意
DRouter.getInstance()
 .action("login/action")
 .context(this)
 .param("key", "value")
 .invokeAction();
// 根据 action 查询执行对应方法,并处理返回回调
DRouter.getInstance()
 .action("circlemodule/test")
 .context(this)
 .invokeAction(new ActionCallback() {
 @Override
 public void onInterrupt() {
 Log.e("TAG", "被拦截了");
 }
 @Override
 public void onResult(RouterResult result) {
 // 注意该方法的执行线程是由 Action 的 threadMode 决定的,也就是说和 Action 在同一个线程
 Log.e("TAG", "result = " + result.toString());
 }
 });
  1. 在任意模块下都可添加拦截
// priority 优先级越高,拦截器执行越优先
@Interceptor(priority = 18)
public class CircleInterceptor implements ActionInterceptor {
 @Override
 public void intercept(ActionChain chain) {
 ActionPost actionPost = chain.action();
 // 圈子详情页必须是要登录,如果没有登录即可拦截跳转到登录页面,否则继续往下执行。
 if (chain.actionPath().equals("circlemodule/test")) {
 Toast.makeText(actionPost.context, "拦截圈子,跳转到登录", Toast.LENGTH_LONG).show();
 // 跳转到登录页面
 DRouter.getInstance()
 .action("login/action")
 .context(actionPost.context)
 .invokeAction();
 // 这个方法调用后便会拦截整条链
 chain.onInterrupt();
 }
 // 继续向下转发
 chain.proceed(actionPost);
 }
}

6.混淆配置

-keep public class com.drouter.assist.**{*;}

三. 其他

  1. 简书详细介绍地址:https://www.jianshu.com/p/d0e1320704e4
  2. 视频详细讲解地址:https://pan.baidu.com/s/1kWoIA95

About

Android 平台多模块多组件开发的路由库

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 98.7%
  • Kotlin 1.3%

AltStyle によって変換されたページ (->オリジナル) /