美文网首页Android知识
PageRouter 一款轻量级Android路由框架(支持Ac

PageRouter 一款轻量级Android路由框架(支持Ac

作者: 咖啡苏克 | 来源:发表于2018-12-03 00:40 被阅读44次

    概述

      原项目是由后台分发url,客户端各Activity在Manifest中配置IntentFilter,通过匹配URL实现跳转和传参(隐式跳转);同时这些页面也支持Intent跳转,通过Bundle传参(显示跳转)。
      Fragment的统一跳转则需要将相关逻辑放入容器Activity中,导致公共的fragment容器注册一大堆IntentFilter,还要为每个Fragment去单独解析参数。
      随着项目迭代,支持跳转的页面越来越多,传参也越来越复杂,Manifest日渐臃肿,Activity中也需要通过判断intent来分别去解析url和bundle获取参数,给项目的迭代与维护增加很多成本。
      基于以上种种问题,我考察了主流的几个开源路由框架,发现都没法完全满足我的需求,有的不支持配置多路径(历史原因部分页面必须支持多路径);有的不支持参数自动解析(便利性大打折扣);普遍功能多,跳转逻辑复杂;基本都不支持Fragment的直接跳转,kolin支持度也参差不齐。
      经过参考了多款路由框架,我实现了一个轻量级Android路由框架:PageRouter,完美解决以上痛点问题,以下是PageRouter的相关特点及使用文档。

    Github

    https://github.com/liujingg/PageRouter

    效果

    pagerouter-demo.gif

    特点

    1. 支持Activity的标准URL解析与跳转
    2. 支持Fragment直接跳转到指定的关联Activity
    3. 支持多路径
    4. 支持多模块工程
    5. 支持手动添加路由
    6. 支持kotlin
    7. 支持参数自动注入,kotlin下支持属性委托获取参数
    8. 支持添加拦截器
    9. 支持全局降级与局部降级策略

    添加依赖

    
        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替换annotationProcessor

        apply 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<String, Class<? extends Activity>> router) {
                router.put("second2", SecondActivity.class);
            }
    
            @Override
                public void initFragmentTable(Map<String, Pair<Class<? extends Activity>, 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 android:name=".RouterCenterActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
    
                <data android:scheme="myscheme"/>
            </intent-filter>
        </activity>
    

    创建一个新的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
                    }
                });
    

    相关文章

      网友评论

        本文标题:PageRouter 一款轻量级Android路由框架(支持Ac

        本文链接:https://www.haomeiwen.com/subject/izqsqqtx.html