# XRouter
**Repository Path**: EricZsp/XRouter
## Basic Information
- **Project Name**: XRouter
- **Description**: 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2025-06-26
- **Last Updated**: 2025-06-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# XRouter
[](https://jitpack.io/#xuexiangjys/XRouter)
[](https://android-arsenal.com/api?level=14)
[](https://github.com/xuexiangjys/XRouter/issues)
[](https://github.com/xuexiangjys/XRouter)
一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用。
## 关于我
[](https://github.com/xuexiangjys) [](http://blog.csdn.net/xuexiangjys)
## 特征
> 由于是借鉴了ARouter,拥有ARouer所有特征,并在此基础上加入了Fragment的路由。
* 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
* 支持多模块工程使用
* 支持添加多个拦截器,自定义拦截顺序
* 支持依赖注入,可单独作为依赖注入框架使用
* 支持InstantRun
* 支持MultiDex(Google方案)
* 映射关系按组分类、多级管理,按需初始化
* 支持用户指定全局降级与局部降级策略
* 页面、拦截器、服务等组件均自动注册到框架
* 支持多种方式配置转场动画
* 支持获取Fragment
* 支持在Fragment中使用Fragment的startActivityForResult启动Activity。
* 完全支持Kotlin以及混编
* 支持第三方 App 加固(使用 xrouter-plugin 实现自动注册)
## 典型应用
* 可结合[XPage--Fragment页面框架](https://github.com/xuexiangjys/XPage),实现应用的全景路由。
* 从外部URL映射到内部页面,以及参数传递与自动解析。
* 跨模块页面跳转,模块间解耦。
* 拦截跳转过程,处理登陆、埋点等逻辑。
* 跨模块API调用,通过控制反转来做组件解耦,实现组件化。
## 1、演示(请star支持)
![][demo-gif]
### Demo下载
[![downloads][download-svg]][download-url]
![][download-img]
## 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`
```
xrouter://xuexiangjys.github.io/test/activity1
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
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