# Router **Repository Path**: makeunion/Router ## Basic Information - **Project Name**: Router - **Description**: App内部私有协议路由框架 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-10-23 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 接入说明 ## 依赖 compile 'cn.memedai.router:router:1.0.0' annotationProcessor 'cn.memedai.router:compiler:1.0.0' ## 版本说明 ### 1.0.0版本 - 提供初始版本,能够解析米么私有协议等 # 使用说明 ##### 1.初始化,建议在Application初始化 Router.initialize(this); ##### 2.在Application模块中使用@Modules注册所有需要动态路由功能的模块, 并在每个模块中使用@Module声明每个模块 app模块 @Modules({"app", "appmodule"})) @Module("app") public class App extends MultiDexApplication { ...... } appmodule模块 @Module("appmodule") public class Module1Activity extends AppCompatActivity { } ##### 3. 在需要配置的Activity上添加注解,支持多个注解 @Route({"test", "http://example.com/user"}) public class TestActivity extends AppCompatActivity { .... } 这样就可以通 Router.build("test").go(context) 或者 Router.build("http://example.com/user").go(context) 打开TestActivity ##### 4.如果不想使用注解的方式来映射路由,也可以使用代码自定义。 // 动态添加路由 Router.addRouteTable(new RouteTable() { @Override public void handleActivityTable(Map> map) { map.put("dynamic", DynamicActivity.class); } }); ##### 5.支持拦截器 Router支持拦截器功能,即拦截路由。添加全局拦截器,每次路由都会回调: Router.addGlobalInterceptor(new RouteInterceptor() { // 判断是否需要拦截 @Override public boolean intercept(Context context, @NonNull Uri uri, @Nullable Bundle extras) { return false; } // 当intercept 返回true时调用该方法 @Override public void intercepted(Context context, @NonNull Uri uri, @Nullable Bundle extras) { Toast.makeText(context, "Intercepted by GlobalInterceptor.", Toast.LENGTH_SHORT).show(); } }); 通过注解对每个Activity 设置拦截器 interceptors的值为拦截器的包名+类名 @Route(value = "intercepted", interceptors = "cn.memedai.router.demo.SampleInterceptor") public class InterceptedActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { ...... } } // 拦截器 package cn.memedai.router.demo; ...... public class SampleInterceptor implements RouteInterceptor { @Override public boolean intercept(Context context, @NonNull Uri uri, @Nullable Bundle extras) { return true; } @Override public void intercepted(Context context, @NonNull Uri uri, @Nullable Bundle extras) { Toast.makeText(context, "Intercepted by SampleInterceptor.", Toast.LENGTH_SHORT).show(); } } 通过设置绿色通道,可以跳过设置的拦截器 Router.build("test").skipInterceptors().go(this); ##### 6.支持回调,目前支持成功和失败两种情况 Router.build(uri).callback(new RouteCallback() { // 添加结果回调 @Override public void callback(RouteResult state, Uri uri, String message) { if (state == RouteResult.SUCCEED) { Toast.makeText(MainActivity.this, "succeed: " + uri.toString(), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "error: " + uri + ", " + message, Toast.LENGTH_SHORT).show(); } } }).go(this); ##### 7. 路由规则 Router目前内置了6个Matcher,每个用户的路由规则可能都不一样,完全可以添加自己的解析规则: Router.registerMatcher(new CustomMatcher(int priority)); 自定义的Matcher需要指定优先级(priority),优先级高的优化匹配。 Router内置了一个MmdMatcher,如果配置如下路由: @Route({"test", "http://example.com/user"}) public class TestActivity extends Activity { ... } 除了可以通过Router.build("zhoupu://open?page=test&id=3&status=ok").go(context)打开TestActivity之外,还可以通过Router.build("http://example.com/user").go(context)打开,如果是Router.build("http://example.com/user?id=9527&status=0").go(context),不仅能打开页面,还帮你配置了Bundle,你可以从TestActivity中获取参数: @Route({"test", "http://example.com/user"}) public class TestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView text = (TextView) findViewById(R.id.text_test); Bundle bundle = getIntent().getExtras(); if (bundle != null && !bundle.isEmpty()) { StringBuilder sb = new StringBuilder(); sb.append("id:") .append(bundle.getString("id")) .append("\n") .append("status:") .append(bundle.getString("status")); text.setText(sb.toString()); } } } 注意:所有的参数都是String类型,请自己转换为需要的数据类型。 Router内置Http网页打开的协议 MmdWebMatcher匹配器 在承载Http协议的Activity设置路由@Route("web"),并通过参数"web_url"来接收打开的url值 @Route("web") public class WebActivity extends Activity { ...... public static final String FLAG_ARGUMENT_URL = "web_url"; ...... } 用户可以参考matcher包实现更符合自己业务规则的Matcher。 Matcher支持配置多个,会依次进行匹配。 ##### 8.获取Intent 有时候只想获取Intent,比如通过Intent发送通知。 Intent intent = Router.build(uri).getIntent(context); 即可获取一个符合路由规则Intent对象。 ##### 9. debug模式 Router在debug模式下支持Log显示,通过 Router.setDebuggable(true); 即可打开。 ##### 10.传递参数 通过代码方式 Bundle bundle = new Bundle(); bundle.putString("extra", "Bundle from MainActivity."); Router.build("result").requestCode(0).extras(bundle).go(this); 在协议中传递 Router.build(Uri.parse("router://host2?id=9527&status=success")).go(this); 感谢[ @chenenyu](https://github.com/chenenyu/Router) 和[ mzule ](https://github.com/mzule/ActivityRouter)