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);

}

}

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

  1. android mvc mvp 简书,浅析 MVP,MVC,MVVM模式(Android)

    前言 当我们接手一个项目的时候,经常会发现一个activity或fragment动辄上千行甚至上万行代码,这给阅读带来很大的困扰,如果想读懂代码,需要花费很多时间跟精力.引起这个问题的原因想必大家都了 ...

  2. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  3. Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  4. 简书推荐作者风云榜(爬取简书app数据)

    一.前言 自处女作<爬取张佳玮138w+知乎关注者:数据可视化>一文分布后,来简书快一个月了(20170831).但一直不怎么熟悉这个平台,因此,这回爬取简书app里的推荐作者并进行简单可 ...

  5. 高仿简书Android,高仿简书个人中心页面

    高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction 1.2 引入Material Design 包 implementation 'com. ...

  6. android 名片识别 简书,简书,也有了我的名片

    0.1,0.09,写一篇文章,获赠简书钻数少得可怜,尽管少了点,我是在一丁点.一丁点积累到了现在,写了十四.五万的文字,总数还不足40:不过看着简书钻数值排行榜的名次,上升了不少,这也给了自己创作一点 ...

  7. android 开启gps 简书,1分钟教你如何打开人生的GPS导航系统

    这两天我在学习李欣频老师的<荣耀天命版的自己>. 李欣频老师说,要找到我们自己的天命所在,因为天命会带出天赋与天职. 图片发自简书App "三十而立,四十不惑,五十知天命&quo ...

  8. android串口工具apk_【APK】一个强大的Android开发工具!

    排版|设计|配图©孤狼小航 Android开发助手是个强大的Android开发工具,能够用来反编译其他应用.查看其他应用布局和控件信息.屏幕取色(颜色取样器).查看Activity历史记录.查看应用M ...

  9. android 开发环境简书,Android Studio 开发环境快速搭建

    目录 - 1.下载JDK.AS - 1.1 JDK下载 - 1.2 AS下载 - 1.3 百度云资源统一下载 - 2.安装JDK - 3.配置JDK及JAVA的环境 - 3.1 打开系统环境 - 3. ...

最新文章

  1. 机器学习实战-之SVM核函数与案例
  2. Android TV 快进帧预览
  3. PAT甲级1083 List Grades:[C++题解]结构体、排序
  4. C++类模版------STL的原理
  5. 数据结构拾遗(2) --红黑树的设计与实现(中)
  6. oracle集群数据库事务配置,在 .NET中使用Oracle数据库事务-安装配置-Oracle频道-中国IT实验室...
  7. 头部互金科技负责人领路知识图谱
  8. 如何快速搭建一个属于自己的网站?
  9. 记录下ES6踩过的坑
  10. 微型计算机乘法部件位于,组成原理复习题8.doc
  11. 清理谷歌浏览器注册表_注册表修改默认浏览器(建议Chrome)
  12. 论文笔记(1) B4: Experience with a Globally-Deployed Software Defined WAN
  13. html5+css3.5手机站标准写法,移动端手机网站基本模板
  14. 系统更新win10服务器出错怎么办,windows10更新升级失败0x80072ee2解决方法
  15. 什么是SEO,为什么要做SEO?
  16. 深入浅出对话系统——概述
  17. 小白攻略(一):数学建模是什么,为什么,怎样做?
  18. codeforces 1326 E.Bombs
  19. 电脑如何关闭445端口
  20. java封神OL_MobaXterm:远程终端登录软件封神选手

热门文章

  1. 牙齿美白有哪些典型症状?
  2. 百度OCR 文字识别 Android安全校验
  3. 2020数据库面试题
  4. java如何获取当前日期和时间
  5. jquery追加html后删除,jquery动态增加删除元素节点
  6. gitHub资源快速访问方法--jsDeliver
  7. 交易所平台币综合研究报告 | TokenInsight
  8. Spring之BeanPostProcessor(后置处理器)介绍
  9. 前目的地罗伯森是谁_如何理解电影《前目的地》(PREDESTINATION)?
  10. 我送大家两句“名言”