XRouter

一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用。

关于我

特征

由于是借鉴了ARouter,拥有ARouer所有特征,并在此基础上加入了Fragment的路由。

支持直接解析标准URL进行跳转,并自动注入参数到目标页面中

支持多模块工程使用

支持添加多个拦截器,自定义拦截顺序

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

支持InstantRun

支持MultiDex(Google方案)

映射关系按组分类、多级管理,按需初始化

支持用户指定全局降级与局部降级策略

页面、拦截器、服务等组件均自动注册到框架

支持多种方式配置转场动画

支持获取Fragment

支持在Fragment中使用Fragment的startActivityForResult启动Activity。

完全支持Kotlin以及混编

支持第三方 App 加固(使用 xrouter-plugin 实现自动注册)

典型应用

从外部URL映射到内部页面,以及参数传递与自动解析。

跨模块页面跳转,模块间解耦。

拦截跳转过程,处理登陆、埋点等逻辑。

跨模块API调用,通过控制反转来做组件解耦,实现组件化。

1、演示(请star支持)

Demo下载

2、如何使用

目前支持主流开发工具AndroidStudio的使用,直接配置build.gradle,增加依赖即可.

2.1、Android Studio导入方法,添加Gradle依赖

1.先在项目根目录的 build.gradle 的 repositories 添加:

allprojects {

repositories {

...

maven { url "https://jitpack.io" }

}

}

2.再在项目根目录的 build.gradle 的 dependencies 添加xrouter-plugin插件:

buildscript {

···

dependencies {

···

classpath 'com.github.xuexiangjys.XRouter:xrouter-plugin:1.0.1'

}

}

3.在主项目的 build.gradle 中增加依赖并引用xrouter-plugin插件

apply plugin: 'com.xuexiang.xrouter' //引用xrouter-plugin插件实现自动注册

dependencies {

···

implementation 'com.github.xuexiangjys.XRouter:xrouter-runtime:1.0.1'

annotationProcessor 'com.github.xuexiangjys.XRouter:xrouter-compiler:1.0.1'

}

4.进行moduleName注册

defaultConfig {

...

javaCompileOptions {

annotationProcessorOptions {

arguments = [ moduleName : project.getName() ]

}

}

}

5.在主项目的Application中初始化XRouter

private void initXRouter() {

if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效

XRouter.openLog(); // 打印日志

XRouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)

}

XRouter.init(this);

}

private boolean isDebug() {

return BuildConfig.DEBUG;

}

2.2 在Library中使用XRouter的配置

1.进行moduleName注册

defaultConfig {

...

javaCompileOptions {

annotationProcessorOptions {

arguments = [ moduleName : project.getName() ]

}

}

}

2.在项目的 build.gradle 中增加XRouter依赖。

dependencies {

···

implementation 'com.github.xuexiangjys.XRouter:xrouter-runtime:1.0.1'

annotationProcessor 'com.github.xuexiangjys.XRouter:xrouter-compiler:1.0.1'

}

2.3 在Kotlin项目中使用XRouter的配置

1.引用kotlin-kapt插件

apply plugin: 'kotlin-kapt'

2.进行moduleName注册

kapt {

arguments {

arg("moduleName", project.getName())

}

}

3.在项目的 build.gradle 中增加XRouter依赖。

dependencies {

···

implementation 'com.github.xuexiangjys.XRouter:xrouter-runtime:1.0.1'

kapt 'com.github.xuexiangjys.XRouter:xrouter-compiler:1.0.1'

}

3、XRouter使用

3.1、路由注册

在支持路由的页面上添加@Router注解(必选)。

这里的路径需要注意的是至少需要有两级,格式:/xx/xx。

@Router(path = "/test/activity")

public class YourActivity extend Activity {

...

}

3.2、路由导航

1.简单的应用内跳转

XRouter.getInstance().build("/test/activity2").navigation();

2.跳转ForResult

XRouter.getInstance()

.build("/test/activity2")

.navigation(this, 666);

3.携带参数进行跳转

XRouter.getInstance().build("/test/activity1")

.withString("name", "老王")

.withInt("age", 18)

.withBoolean("boy", true)

.withLong("high", 180)

.withString("url", "https://a.b.c")

.withParcelable("pac", testParcelable)

.withObject("obj", testObj)

.withObject("objList", objList)

.withObject("map", map)

.navigation();

4.添加跳转动画

//旧版本跳转动画

XRouter.getInstance()

.build("/test/activity2")

.withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)

.navigation(getActivity());

//新版本跳转动画

ActivityOptionsCompat compat = ActivityOptionsCompat.

makeScaleUpAnimation(getListView(), getListView().getWidth() / 2, getListView().getHeight() / 2, 0, 0);

XRouter.getInstance()

.build("/test/activity2")

.withOptionsCompat(compat)

.navigation();

5.添加路由跳转的监听

// 使用两个参数的navigation方法,可以获取单次跳转的结果

XRouter.getInstance().build("/test/1").navigation(this, new NavigationCallback() {

@Override

public void onFound(Postcard postcard) {

...

}

@Override

public void onLost(Postcard postcard) {

...

}

});

3.3、通过URI跳转

1.新建一个Activity用于监听Scheme事件,之后直接把uri传递给XRouter即可

public class SchemeFilterActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 直接通过XRouter处理外部Uri

Uri uri = getIntent().getData();

XRouter.getInstance().build(uri).navigation(this, new NavCallback() {

@Override

public void onArrival(Postcard postcard) {

finish();

}

});

}

}

2.在AndroidManifest.xml中注册intent-filter

android:host="xuexiangjys.github.io"

android:scheme="xrouter"/>

android:host="xuexiangjys.github.io"

android:scheme="http"/>

android:host="xuexiangjys.github.io"

android:scheme="https"/>

3.使用URI进行跳转

(1) 网页中的超链接URI路径:

自定义Scheme[通常来说都是这样的]

xrouter://xuexiangjys.github.io/test/activity1

测试URL Encode情况

xrouter://xuexiangjys.github.io/test/activity1?name=alex&age=18&boy=true&high=180&obj={"name":"jack","id":"666"}

xrouter://xuexiangjys.github.io/test/activity2

xrouter://xuexiangjys.github.io/test/activity2?key1=value1

xrouter://xuexiangjys.github.io/test/activity3?name=alex&age=18&boy=true&high=180

App Links[防止被App屏蔽]

http://xuexiangjys.github.io/test/activity1

http://xuexiangjys.github.io/test/activity2

(2) 构建一个URI

Uri testUriMix = Uri.parse("xrouter://xuexiangjys.github.io/test/activity2");

XRouter.getInstance().build(testUriMix)

.withString("key1", "value1")

.navigation();

3.4、参数自动注入

1.使用@AutoWired标注需要自动注入的参数。

在需要自动注入的参数上添加@AutoWired注解,可设置name、required、desc属性。

自动注入的参数不能是private类型。

@AutoWired(required = true)

String name = "jack";

@AutoWired

int age = 10;

@AutoWired

int height = 175;

@AutoWired(name = "boy")

boolean girl;

2.使用XRouter.getInstance().inject(this);进行依赖注入。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test1);

//进行依赖注入

XRouter.getInstance().inject(this);

}

3.如果需要传递或者依赖注入Object类型的参数,需要添加实现 SerializationService 服务,这里以Gson实现序列化的服务为例如下:

@Router(path = "/service/json")

public class JsonSerializationService implements SerializationService {

@Override

public void init(Context context) {

}

@Override

public String object2Json(Object instance) {

return JsonUtil.toJson(instance);

}

@Override

public T parseObject(String input, Type clazz) {

return JsonUtil.fromJson(input, clazz);

}

}

3.5、服务发现

1.构建服务:实现IProvider接口或者实现继承IProvider的接口,使用@Router进行标注。例如:

public interface HelloService extends IProvider {

void sayHello(String name);

}

@Router(path = "/service/hello")

public class HelloServiceImpl implements HelloService {

/**

* Do your init work in this method, it well be call when processor has been load.

*

* @param context ctx

*/

@Override

public void init(Context context) {

}

@Override

public void sayHello(String name) {

ToastUtils.toast("Hello " + name);

}

}

【注意】:这里需要注意,实现的服务不能自定义构造函数,只能使用默认的构造函数。

2.发现服务:根据服务的类或者服务注册的路由获取服务,也可以使用依赖注入的方式获取服务。

(1)根据服务的类获取服务

XRouter.getInstance().navigation(HelloService.class)

.sayHello("mike");

(2)根据服务注册的路由获取服务

((HelloService) XRouter.getInstance().build("/service/hello")

.navigation())

.sayHello("mike~~");

(3)依赖注入的方式获取服务

public class Test {

@Autowired

HelloService helloService;

@Autowired(name = "/service/hello")

HelloService helloService2;

public Test() {

ARouter.getInstance().inject(this);

}

public void testService() {

// 1. (推荐)使用依赖注入的方式发现服务,通过注解标注字段,即可使用,无需主动获取

// Autowired注解中标注name之后,将会使用byName的方式注入对应的字段,不设置name属性,会默认使用byType的方式发现服务(当同一接口有多个实现的时候,必须使用byName的方式发现服务)

helloService.sayHello("Vergil");

helloService2.sayHello("Vergil");

}

}

3.6、路由拦截器

1.需要实现IInterceptor接口,使用@Interceptor进行标注。

2.配置拦截器的优先级(必填)。优先级的数字越小,拦截器的优先级越高。XRouter将按优先级高低依次执行拦截.

3.拦截器的优先级不能重复,每个拦截器只能拥有不同的优先级。

@Interceptor(priority = 8, name = "测试用拦截器")

public class TestInterceptor implements IInterceptor {

@Override

public void process(Postcard postcard, InterceptorCallback callback) {

...

callback.onContinue(postcard); // 处理完成,交还控制权

// callback.onInterrupt(new RuntimeException("我觉得有点异常")); // 觉得有问题,中断路由流程

// 以上两种至少需要调用其中一种,否则不会继续路由

}

@Override

public void init(Context context) {

// 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次

}

}

3.7、路由降级

1.全局路由降级:全局路由降级需要实现DegradeService接口,示例代码如下:

@Router(path = "/service/degrade")

public class ToastDegradeService implements DegradeService {

/**

* 路由丢失.

*

* @param context

* @param postcard 路由信息

*/

@Override

public void onLost(Context context, Postcard postcard) {

//这里做你的降级操作

ToastUtils.toast("进行全局的降级~~");

}

/**

* 进程初始化的方法

*

* @param context 上下文

*/

@Override

public void init(Context context) {

}

}

2.局部路由降级

XRouter.getInstance().build("/xxx/xxx").navigation(getContext(), new NavCallback() {

@Override

public void onFound(Postcard postcard) {

Log.d("XRouter", "找到了");

}

@Override

public void onLost(Postcard postcard) {

Log.d("XRouter", "找不到了");

//这里做你的降级操作

ToastUtils.toast("进行局部的降级~~");

}

@Override

public void onArrival(Postcard postcard) {

Log.d("XRouter", "跳转完了");

}

@Override

public void onInterrupt(Postcard postcard) {

Log.d("XRouter", "被拦截了");

}

});

3.8、路由重定向

需要实现PathReplaceService,并配置@Router标注。实现如下:

@Router(path = "/xxx/xxx") // 必须标明注解

public class PathReplaceServiceImpl implements PathReplaceService {

/**

* For normal path.

*

* @param path raw path

*/

String forString(String path) {

return path; // 按照一定的规则处理之后返回处理后的结果

}

/**

* For uri type.

*

* @param uri raw uri

*/

Uri forUri(Uri uri) {

return url; // 按照一定的规则处理之后返回处理后的结果

}

}

代码混淆

-keep public class com.xuexiang.xrouter.routes.**{*;}

-keep class * implements com.xuexiang.xrouter.facade.template.ISyringe{*;}

# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口

-keep interface * implements com.xuexiang.xrouter.facade.template.IProvider

# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现

-keep class * implements com.xuexiang.xrouter.facade.template.IProvider

特别感谢

联系方式

向我提问

打开微信扫一扫,向我提问:

xpage 传参_一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用。...相关推荐

  1. XRouter 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用

    XRouter 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用. 关于我 特征 由于是借鉴了ARouter,拥有ARouer所有特征 ...

  2. Google Guice 一个轻量级的依赖注入框架

    1.美图 2.概述 2.1 背景 在做项目的时候,看见有段代码直接是使用Google Guice 注入了avaitor表达式. 2.1 官网 Github 主页:https://github.com/ ...

  3. android路由框架 简书,【推荐】好用强大的Android路由框架--Rudolph

    Rudolph Rudolph Android Router Framework(鲁道夫安卓路由框架组件)github上查看 目录 1.框架特性 支持组件API模块自动生成 自动生成路由Builder ...

  4. 使用Kotlin打造Android路由框架-KRouter

    KRouter(https://github.com/richardwrq/KRouter)路由框架借助gradle插件.kapt实现了依赖注入.为Android平台页面启动提供路由功能. ####从 ...

  5. 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...

    XPush 一个轻量级.可插拔的Android消息推送框架.一键集成推送(极光推送.友盟推送.华为.小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 在提iss ...

  6. xpage 传参_jQuery iScroll.js 移动端滚动条美化插件第1/5页

    demo: iScroll功能很强大,目前我只用来 自定义滚动条 以下简单介绍一下iscrol在移动端自定义滚动条时的使用和注意事项. 一.用法 iScroll对要滚动的元素进行初始化,且不限制一个页 ...

  7. android实现mysql数据库存储_一个简单的Android端对象代理数据库系统的实现(二、执行+存储)...

    这是我之前在武汉大学彭智勇老师那边做过的一个对象代理数据库系统.文中给出了一整个系统的几乎所有代码,经测试可正常运行.文章比较长,超出了知乎的最长文章范围,因此分为两篇文章.这是第二篇. 执行 执行部 ...

  8. mybatis java传参_[Java教程]Mybatis批量和传参

    [Java教程]Mybatis批量和传参 0 2014-07-31 04:00:12 MyBatis中批量插入 方法一: resultType="java.lang.String" ...

  9. vue 事件调用 传参_对vue下点击事件传参和不传参的区别详解

    如下所示: {{btn_text1}} {{btn_text2}} var _vm = new Vue({ data : { btn_text1 : '点击1' , btn_text2 : '点击2' ...

最新文章

  1. linux虚拟机文件挂载
  2. 多表查询事务DCL权限管理
  3. [Mummy Maze] 宽度优先搜索
  4. 使用SQL Agent和SignalR的每日提醒
  5. 华为 P40 或首发鸿蒙系统;新 iPhone Logo 移至中间;React 组件库 uiw 3.4.0 发布 | 极客头条​...
  6. 怎样在MyEclipse中连接Oracle数据库
  7. 二叉树类图_设计模式前言——UML类图
  8. poj 1695 动态规划
  9. sqlalchemy用in_ 批量delete
  10. MyBatis(四)------MyBatis的生命周期及配置实例
  11. ArcGIS自动矢量化~
  12. TkMybatis 是什么?
  13. Java 12 新特性
  14. 高效领导者提升思考力的5个底层法则
  15. 关于win7升级win10后高分屏界面显示模糊问题,字迹显示模糊问题解决办法
  16. vue移动端h5中a标签下载/预览文件
  17. pt100转4-20mA,一转一/二转二热电阻温度变送器
  18. nvm use 报错:You do not have sufficient privilege to perform this operation
  19. c 窗体连接mysql_c 窗体如何连接数据库
  20. 新近起病的活动性RA患者中达标治疗与常规治疗的疗效比较:来自GUEPARD试验和ESPOIR队列的数据...

热门文章

  1. 消息队列RabbitMQ基本使用(Java代码实现)
  2. Python输入账号密码判断是否正确并输出,典型案例-百钱买百鸡的两个程序代码
  3. Python_001_旅游评论情感倾向性分析_000_分析(基于深度学习的微博评论情感倾向性分析_胡西祥)论文
  4. FontAwesome 图标 class=fa fa-home
  5. 来看看未来最有前景的行业
  6. 北航计算机学院教授马帅,北航离散数学大一课件(马帅)指南.pdf
  7. 评价模型——目标权重的确定
  8. 秃顶路人的计算机系统大作业Hello
  9. 个人理财类书籍推荐 -- From一亩三分地 帖子
  10. 全景视角下的世界探索——三维全景地图