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

Rudolph

Rudolph Android Router Framework(鲁道夫安卓路由框架组件)github上查看

目录

1.框架特性

支持组件API模块自动生成

自动生成路由Builder类与服务类的接口层;

加载更快,更稳定,无需dex扫描方式加载;

无需指定模块名,接入更简单;

显式跳转与URL路由地址跳转融为一体,更方便快捷;

通过Builder方式传参,无需手动写参数名,从而减少参数传错和修改带来的Bug隐患;

支持所有Intent的参数类型;

支持Activity 、Fragment、Service、Method四种路由类型

支持Instant Run

支持AndroidX

支持Kotlin

2.依赖方式

Build.gradle

repositories {

jcenter()

...

}

Java:

dependencies {

implementation 'cn.wzbos.rudolph:rudolph:1.0.1'

annotationProcessor 'cn.wzbos.rudolph:rudolph-compiler:1.0.1'

}

Kotlin:

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-kapt'

...

dependencies {

implementation 'cn.wzbos.rudolph:rudolph:1.0.1'

kapt 'cn.wzbos.rudolph:rudolph-compiler:1.0.1'

}

3.代码混淆

如果开启了代码混淆,只需要在混淆配置文件中添加如下配置

-keep class * implements cn.wzbos.android.rudolph.IRouteTable{*;}

-keep class * implements cn.wzbos.android.rudolph.IRouteBinder{*;}

-keepclassmembers class ** {

@cn.wzbos.android.rudolph.annotations.Route ;

}

4.调用方式

Activity

定义一个Activity路由,如果不需要用url方式调用可以不写路由地址

@Route("/activity/test")

public class TestActivity extends AppCompatActivity {

@Arg("userId")

int userId;

@Arg("userName")

String userName;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Rudolph.bind(this);

}

}

调用Activity

UserActivityRouter.builder().userId(11).userName("John").build().start(context);

或者

Rudolph.builder("/user?userId=11&userName=John").build().open(context);

Fragment

创建一个Fragment路由

@Route("/fragment/test")

public class TestFragment extends Fragment {

@Arg("userId")

int userId;

@Arg("userName")

String userName;

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Rudolph.bind(this);

}

}

调用Fragment

Fragment fragment = TestFragmentRouter.builder().userId(11).userName("John").build().open();

或者

Rudolph.builder("/fragment/user?userId=11&userName=John").build().open();

Service

创建一个服务(适用于跨module调用)

@Route(vaule="/service/test",export = true)

public class TestService implements IRouteService{

@Arg

int userId;

@Arg

String userName;

@Override

public void init(Bundle bundle) {

Log.d("TestService", "afterInject");

rudolph.bind(TestService.this, bundle);

}

@Export

public void showMessage(Context context, String msg) {

Toast.makeText(context, msg + "\nuserId:" + userId + ",userName:" + userName, Toast.LENGTH_SHORT).show();

}

}

注意:服务类必须实现IRouteService接口

调用服务

ITestService service = TestServiceRouter.builder().userId(1).userName("Tom").build().open();

service.showMessage(MainActivity.this, "Hello Provider!");

或者

ITestService service = (ITestService)Rudolph.builder("/service/test?userId=11&userName=John").build().open();

service.showMessage(MainActivity.this, "Hello Provider!");

Method

public class TestMethod {

@Route("/method/test")

public static void Test(@Arg Context context, @Arg int userId, @Arg String userName) {

Toast.makeText(context, "Hello Method!\nuserId:" + userId + ",userName:" + userName, Toast.LENGTH_SHORT).show();

}

}

调用方式:

Rudolph.builder("/method/test?userId=11&userName=John").build().open(context);

注意:

1.方法必须为静态方法

2.context是获取open(context)传的上下文,如果调用的时候没context值则接收的值为ApplicationContext

5.注解说明

@Route

此注解为标识一个路由;

参数:

value:路由地址,可为空,例如@Route("/room")

export:是否导出API,一般组件化刚才才会用

@Route(value = "/user",export = true)

public class UserActivity extends AppCompatActivity {

}

@Arg

此注解为标识路由的参数(注意如果注解到字段上,此字段不能为private)。

参数:

value:路由地址,可为空(默认取字段名),例如@Arg("userId"),@Arg(RAW_URI)

base64:标识此参数是否为base64方式编码

json:标识此参数是否为json格式

@Route(value = "/user",export = true)

public class UserActivity extends AppCompatActivity {

@Arg("userId")

int userId;

@Arg

String userName;

@Arg(value="userInfo",base64=true, json=true)

String userInfo;

}

@Component

此注解为组件化所需要的注解,主要为提供组件初始化操作;

参数:无

@Component

public class TestComponent implements IRouteTable {

@Override

public void init(Application application) {

Toast.makeText(application.getApplicationContext(), "组件xxx初始化啦!", Toast.LENGTH_SHORT).show();

}

}

@Export

导出注解的方法,此注解只能用在Method上,且此方法必须为非静态(static)的Public方法;

参数:无

@Route

public class TestService implements IRouteService{

@Export

public void showMessage(String message) {

}

}

6.组件化

场景:A模块需要调用B模块

实现方式:需要导出B模块的API(当然如果想用纯URL的方式调用可以不导出),然后A、B 模块都依赖B模块的API

操作步骤:

第一步:在B模块的的build.gradle中增加如下配置,其中export_api_name为导出的API模块名,export_api_package为导出的API包名

defaultConfig {

...

javaCompileOptions {

annotationProcessorOptions {

arguments = [

export_api_name : project.getName() + "_api",

export_api_package: "com.xxxx.module_b_api"

]

includeCompileClasspath = true

}

}

}

第二步:点击重新编译,然后就能看到生成的API工程,看到API工程后再到settings.gradle中增加以下依赖

include ':module_b_api'

第三步:需要在A模块和B模块中增加依赖

dependencies {

implementation project(':module_b_api')

}

初始化组件

通过以下代码可以初始化每个组件

@Component

public class TestComponent implements IRouteTable {

@Override

public void init(Application application) {

Toast.makeText(application.getApplicationContext(), "组件xxx初始化啦!", Toast.LENGTH_SHORT).show();

}

}

(注意:@Component注解的类,每个module中只能存在一个)

7.常见问题

路由参数支持的数据类型

@Route(value = "/activity/test",export = true)

public class TestActivity extends AppCompatActivity {

@Arg(RAW_URI)

String routeUri;

@Arg("stringArg")

String stringArg;

@Arg(value = "string64", base64 = true)

String string64Arg;

@Arg("stringArray")

String[] stringArrayArg;

@Arg("boolArg")

boolean boolArg;

@Arg("booleanArray")

boolean[] booleanArrayArg;

@Arg("byteArg")

byte byteArg;

@Arg("byteArray")

byte[] byteArrayArg;

@Arg("shortArg")

short shortArg;

@Arg("shortArray")

short[] shortArrayArg;

@Arg("intArg")

int intArg;

@Arg("intArrayArg")

int[] intArrayArg;

@Arg("longArg")

long longArg;

@Arg("longArray")

long[] longArrayArg;

@Arg("charArg")

char charArg;

@Arg("charArray")

char[] charArrayArg;

@Arg("floatArg")

float floatArg;

@Arg("floatArray")

float[] floatArrayArg;

@Arg("doubleArg")

double doubleArg;

@Arg("doubleArray")

double[] doubleArrayArg;

@Arg("characterArg")

Character characterArg;

//ArrayList

@Arg

ArrayList stringArrayListArg;

@Arg

ArrayList integerArrayListArg;

@Arg(value = "charSequenceArrayList")

ArrayList charSequenceArrayListArg;

@Arg(value = "parcelableArrayList")

ArrayList parcelableArrayListArg;

@Arg(value = "serialized")

Broker serializedParam;

//json

@Arg(value = "json", json = true)

User jsonParam;

//encode:json->base64,decode:base64->json

@Arg(value = "base64json", json = true, base64 = true)

User base64jsonParam;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Rudolph.bind(this);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值