概述
??原项目是由后端分发url,用户端各Activity在Manifest中配置IntentFilter,通过匹配URL实现跳转和传参(隐式跳转);同时这些页面也支持Intent跳转,通过Bundle传参(显示跳转)。
??Fragment的统一跳转则需要将相关逻辑放入容器Activity中,导致公共的fragment容器注册一大堆IntentFilter,还要为每个Fragment去单独解析参数。
??随着项目迭代,支持跳转的页面越来越多,传参也越来越复杂,Manifest日渐臃肿,Activity中也需要通过判断intent来分别去解析url和bundle获取参数,给项目的迭代与维护添加很多成本。
??基于以上种种问题,我考察了主流的几个开源路由框架,发现都没法完全满足我的需求,有的不支持配置多路径(历史起因部分页面必需支持多路径);有的不支持参数自动解析(便利性大打折扣);普遍功能多,跳转逻辑复杂;基本都不支持Fragment的直接跳转,kolin支持度也参差不齐。
??经过参考了多款路由框架,我实现了一个轻量级Android路由框架:PageRouter,完美处理以上痛点问题,以下是PageRouter的相关特点及使用文档。
Github
liujingg/PageRouter
效果
pagerouter-demo.gif
特点支持Activity的标准URL解析与跳转
支持Fragment直接跳转到指定的关联Activity
支持多路径
支持多板块工程
支持手动增加路由
支持kotlin
支持参数自动注入,kotlin下支持属性委托获取参数
支持增加阻拦器
支持全局降级与局部降级策略
增加依赖android { defaultConfig { ... //multi module configuration javaCompileOptions { annotationProcessorOptions { arguments = [targetModuleName: 'Other']// replace with the other module project name } } } } dependencies { // Replace the last version implementation "com.liujing.pagerouter:router:last-version" annotationProcessor "com.liujing.pagerouter:router-compiler:last-version" ... }
kotlin 项目请使用kapt替换annotationProcessorapply plugin: 'kotlin-kapt // Replace the last version implementation "com.liujing.pagerouter:router:last-version" kapt "com.liujing.pagerouter:router-compiler:last-version"
功能与使用
1. 初始化
强烈建议在Application中初始化。Router.init("pagerouter"); //your application's specific scheme
注册其余板块路由(如有)。Router.register(new OtherRouterInitializer());
手动增加路由条目(可选)。Router.register(new RouterInitializer() { @Override public void initActivityTable(Map> router) { router.put("second2", SecondActivity.class); } @Override public void initFragmentTable(Map, Class extends Fragment>>> router) { } });
2. 增加注解
Activity注解@RouterActivity({"second", "third"}) public class SecondActivity extends AppCompatActivity { ... }
Fragment注解// The activityClazz here means the fragment currently associated with Activity @RouterFragment(value = "myfragment", activityClazz = FragmentContainerActivity.class) public class MyFragment extends Fragment { ... }
3. 参数解析@RouterActivity({"second"}) public class SecondActivity extends AppCompatActivity { @RouterField("id") // map parameters in the url by name private int id; ... @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_common); Router.inject(this);// PageRouter will automatically set value of fields ... } }
4. 发起跳转Router.startActivity(context,"scheme://second?id=17")
5. 混淆-keep class * extends com.liujing.pagerouter.RouterInitializer { *; }
6. 跳转结果回调Router.startActivity( this, "pagerouter://other?id=17", object : RouteCallback { override fun onSuccess(context: Context, uri: Uri) { Toast.makeText(context, "success", Toast.LENGTH_SHORT).show() } override fun onFailed(context: Context?, message: String?) { Toast.makeText(context, "failed : $message", Toast.LENGTH_SHORT).show() } })
7. 外部URL跳转
AndroidManifest.xml中
创立一个新的Activity用于监听scheme事件public class RouterCenterActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Uri data = getIntent().getData(); if (data != null) { Router.startActivity(this, data.toString()); } this.finish(); } }
8. 增加阻拦器Router.setIntercept(new IIntercept() { @Override public void process(@NonNull Context context, @NonNull Uri uri, InterceptorCallback callback) { if (...) { //TODO do something callback.onInterrupt(result, message);//interrupt routing process } else { callback.onContinue(uri); } } });
9. 全局策略Router.setDefaultCallBack(new RouteCallback() { @Override public void onSuccess(Context context, Uri uri) { } @Override public void onFailed(Context context, String message) { //TODO do something } });