android路由跳转实现,PageRouter 一款轻量级Android路由框架(支持Activity与Fragment跳转)...

概述

??原项目是由后端分发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

效果

b5f1e1ea324239a598168cdd8cb9b4ff.gifpagerouter-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 } });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值