Skip to content
Wiki edited this page Aug 24, 2021 · 17 revisions

Maven Central

GRouter - 为Android组件化开发而生的路由框架

组件化开发架构中,页面跳转组件间调用是至关重要的两大问题,目前Github上已经有多个开源框架,基本都是通过拼接参数来实现页面跳转、获取服务实例。

GRouter 兼容拼接参数方式同时,区别于其他组件化方案推出了安全构造器方案,把工程内的Activity和服务类的构造器生成在GActivityCenter、GComponentCenter、GTaskCenter、GDelegateCenter类中,方便我们安全地调用,避免了拼接参数容易写错,或者目标类被修改带来的运行错误。

特点

  1. 支持AndroidX、支持 Java 和 Kotlin。
  2. 支持FlutterHybrid H5混合项目,可以通过URL调用原生模块获取服务数据、跳转Activity。
  3. 支持多Module项目、多工程项目;多工程项目支持多scheme。
  4. Activity 跳转支持设置默认转场动画,支持设置单次转场动画,支持指定 Flag,支持多级跳转
  5. Activity、Fragment、Task支持参数注入,无需手动解析参数。
  6. 提供RouterComponent、RouterTask、RouterDelegate三种强大的组件间调用服务组件。
  7. 支持生成HTML文档和导入RAP,方便查询。
  8. 支持服务降级,支持通过服务降级Mock数据,可以实现单Module运行调试,提高开发效率。
  9. 各个组件均支持自动生成构造器,避免拼接参数容易写错问题。
  10. 提供 IDEA 插件,支持快捷跳转到目标类,支持 Java 和 Kotlin。
  11. 使用Gradle插件注册Module模块,简化配置。
  12. RouterComponent支持获取Fragment。
  13. 支持从外部浏览器和其它APP打开内部Activity
  14. 内置5组页面Activity过场动画,并支持5.0的Activity过场动画。

GRouter已经在拥有434个Activity、28个Module的千万用户级别APP稳定使用,大家可以放心使用。GRouter 会一直致力于组件化解决方案,如果你有更好的建议,可以提Issues或私聊联系我。如果你觉得还不错,欢迎 star 该 Github 项目,我们会有持续的优化迭代,感谢你的支持!

文档

查看文档

示例

Activity 页面跳转

// 不推荐
GRouter.getInstance().startActivity(context, "grouter://activity/user?uid=1")
// 不推荐
GRouter.getInstance().activityBuilder("user").put("uid",1).start(context)
// 推荐
GActivityCenter.UserActivity().uid(123).start(context)

下沉接口式 - 组件间服务调用

// 不推荐
val userService = GRouter.getInstance().getComponent("userService") as UserService
// 不推荐
val userService = GRouter.getInstance().getComponent("userService",UserService::class.java)
// 推荐
val userService = GComponentCenter.UserServiceImpl()

非下沉式 - 组件间单任务调用

// 不推荐
val response = GRouter.getInstance().taskBuilder("grouter://task/getUser?uid=1").execute()
// 不推荐
val response = GRouter.getInstance().taskBuilder("getUser").put("uid",1).execute()
// 推荐
val response = GTaskCenter.GetUserTask().uid(1).execute()
// 获取返回值
val user = response.value(User::class.java)

非下沉式 - 反射代理服务

val accountServiceDelegate = GDelegateCenter.AccountService(context)

使用教程

配置 gradle.properties

# 如果是多Module,请填写填写BaseModule的路径{base-module-name}/src/main/java
GROUTER_SOURCE_PATH =app/src/main/java 
# 请填写自己项目独特的scheme
GROUTER_SCHEME =grouter
# 是否开启AndroidX模式
GROUTER_ANDROIDX = false

配置根目录 build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'io.github.taoweiji.grouter:grouter-gradle-plugin:+'
    }
}
allprojects {
    repositories {
        jcenter()
    }
}

在每一个Module的 build.gradle 增加

// 需要注意顺序,必须放在其它 'apply plugin: XXX' 后面
apply plugin: 'grouter' 

在 MyApplication 进行初始化

// fastjson
GRouter.setSerialization(object : GRouter.Serialization {
    override fun serialize(any: Any): String {
        return JSON.toJSONString(any)
    }
    override fun <T> deserializeObject(json: String, clazz: Class<T>): T? {
        return JSON.parseObject(json, clazz)
    }
    override fun <T> deserializeList(json: String, clazz: Class<T>): List<T>? {
        return JSON.parseArray(json, clazz)
    }
})
// GSON 
//GRouter.setSerialization(object : GRouter.Serialization{
//    var gson = Gson()
//    override fun serialize(any: Any?): String {
//        return gson.toJson(any)
//    }
//    override fun <T : Any?> deserializeObject(json: String?, clazz: Class<T>?): T {
//        return gson.fromJson(json,clazz)
//    }
//    override fun <T : Any?> deserializeList(json: String?, clazz: Class<T>?): MutableList<T> {
//        return gson.fromJson(json, TypeToken.getParameterized(List::class.java,clazz).type)
//    }
//})
GRouter.getInstance().init(this, BuildConfig.BUILD_TYPE, null)

@RouterActivity

增加注解,然后点击顶部菜单 BuildMake Module XXX 就会在 GActivityCenter 中生成构造器方法。

@RouterActivity("user")
class UserActivity : AppCompatActivity() {
    @RouterField
    var uid: Int? = null
    @RouterField
    var user: User? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GRouter.inject(this)
        Log.e("uid", uid.toString())
    }
}

支持三种方式跳转,如果是在当前工程建议使用第三种方式跳转

// 方式一
GRouter.getInstance().startActivity(context, "grouterdemo://activity/user?uid=1")
// 方式二
GRouter.getInstance().activityBuilder("user").put("uid",1).start(context)
// 方式三:推荐
GActivityCenter.UserActivity().user(User(1,"Wiki")).start(context)

RouterField参数支持类型:int、long、float、double、boolean、Integer、Long、Double、Float、Boolean、String、int[]、long[]、float[]、double[]、boolean[]、String[]、可序列化List、可序列化Object

详细文档

@RouterTask

增加注解,然后点击顶部菜单 BuildMake Module XXX 就会在 GTaskCenter 中生成构造器方法。

@RouterTask(path = "getUser")
public class GetUserTask extends GRouterTask {
    @RouterField
    public int uid;
    @RouterField
    public String name;
    @Override
    public Object process() {
      	// do something
        return new User(uid, "Wiki");
    }
}

支持三种方式调用

// 方式一:通过url创建
val response = GRouter.getInstance().taskBuilder("grouter://task/getUser?uid=1").execute()
// 方式二:通过构造器创建
val response = GRouter.getInstance().taskBuilder("getUser").put("uid",1).execute()
// 方式三:通过自动构造器
val response = GTaskCenter.GetUserTask().uid(1).execute()

// 支持直接获取返回的对象
val user = response.value(User::class.java)
// 支持直接获取返回对象的某个字段
val userName = response.map()["name"]
// 支持直接获取返回的json序列化
val text = response.string()

方式一,RouterField参数支持类型:int、long、float、double、boolean、Integer、Long、Double、Float、Boolean、String、int[]、long[]、float[]、double[]、boolean[]、String[]、可序列化List、可序列化Object。

如果是方式二和方式三,支持任意类型参数。

详细文档

@RouterComponent

在 BaseModule 增加接口

interface UserService {
    fun getUser(uid: Int): User?
}

在 Module 中编写实现类,然后点击顶部菜单 BuildMake Module XXX 就会在 GComponentCenter 中生成构造器方法。

@RouterComponent(value = "userService",protocol = AccountService::class)
class UserServiceImpl : UserService {
    constructor() {}
  	@RouterComponentConstructor
    constructor(context: Context) {}
    override fun getUser(uid: Int): User? {
        return null
    }
}

有两种方式调用

// 不推荐
val userService = GRouter.getInstance().getComponent("userService") as UserService
// 不推荐
val userService = GRouter.getInstance().getComponent("userService",UserService::class.java)
// 推荐
val userService = GComponentCenter.UserServiceImpl()

val user = userService.getUser(1)

详细文档

@RouterDelegate

在Module中创建服务类,然后点击顶部菜单 BuildMake Module XXX 就在 GDelegateCenter 中生成构造器方法。

@RouterDelegate
class AccountService {
  	constructor() {}
    @RouterDelegateConstructor
    constructor(context: Context) {}
    @RouterDelegateMethod
    fun login(username: String, password: String): User? {
      	// do something
        return null
    }
}

在其它无依赖的Module或者BaseModule都可用直接使用生成的代理类调用

val accountServiceDelegate = GDelegateCenter.AccountService(context)
val user = accountServiceDelegate.login("","")

详细文档

异常处理(一定要注意)

当开发过程中由于合并错误,或者忘记了下沉接口或参数类到BaseModule导致出现编译异常,请在命令行执行以下命令解决错误,也可以在Gradle面板找到 grouter/GRouterFixRelease 执行,其它异常问题浏览。

./gradlew GRouterFixRelease

IDEA插件

在 Android Studio 的 Plugins 搜索GRouter 下载即可。

ProGuard 混淆

如果项目用到了混淆,需要添加下面代码到proguard-rules.pro

-keep class com.grouter.GRouterInitializer
-keep @com.grouter.RouterComponent class *
-keep @com.grouter.RouterDelegate class *
-keep @com.grouter.RouterInterceptor class *
-keep @com.grouter.RouterTask class *
-keep @com.grouter.RouterActivity class *
-keepclasseswithmembers class * {
    @com.grouter.RouterField <fields>;
}
-keepclasseswithmembers class * {
    @com.grouter.RouterDelegateMethod <methods>;
}
-keepclasseswithmembers class * {
    @com.grouter.RouterDelegateConstructor <init>(...);
}
-keepclasseswithmembers class * {
    @com.grouter.RouterComponentConstructor <init>(...);
}

License

Copyright 2019 taoweiji

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.