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);
}
}
android路由框架 简书,【推荐】好用强大的Android路由框架--Rudolph相关推荐
- android mvc mvp 简书,浅析 MVP,MVC,MVVM模式(Android)
前言 当我们接手一个项目的时候,经常会发现一个activity或fragment动辄上千行甚至上万行代码,这给阅读带来很大的困扰,如果想读懂代码,需要花费很多时间跟精力.引起这个问题的原因想必大家都了 ...
- android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容
简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...
- Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...
简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...
- 简书推荐作者风云榜(爬取简书app数据)
一.前言 自处女作<爬取张佳玮138w+知乎关注者:数据可视化>一文分布后,来简书快一个月了(20170831).但一直不怎么熟悉这个平台,因此,这回爬取简书app里的推荐作者并进行简单可 ...
- 高仿简书Android,高仿简书个人中心页面
高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction 1.2 引入Material Design 包 implementation 'com. ...
- android 名片识别 简书,简书,也有了我的名片
0.1,0.09,写一篇文章,获赠简书钻数少得可怜,尽管少了点,我是在一丁点.一丁点积累到了现在,写了十四.五万的文字,总数还不足40:不过看着简书钻数值排行榜的名次,上升了不少,这也给了自己创作一点 ...
- android 开启gps 简书,1分钟教你如何打开人生的GPS导航系统
这两天我在学习李欣频老师的<荣耀天命版的自己>. 李欣频老师说,要找到我们自己的天命所在,因为天命会带出天赋与天职. 图片发自简书App "三十而立,四十不惑,五十知天命&quo ...
- android串口工具apk_【APK】一个强大的Android开发工具!
排版|设计|配图©孤狼小航 Android开发助手是个强大的Android开发工具,能够用来反编译其他应用.查看其他应用布局和控件信息.屏幕取色(颜色取样器).查看Activity历史记录.查看应用M ...
- android 开发环境简书,Android Studio 开发环境快速搭建
目录 - 1.下载JDK.AS - 1.1 JDK下载 - 1.2 AS下载 - 1.3 百度云资源统一下载 - 2.安装JDK - 3.配置JDK及JAVA的环境 - 3.1 打开系统环境 - 3. ...
最新文章
- 机器学习实战-之SVM核函数与案例
- Android TV 快进帧预览
- PAT甲级1083 List Grades:[C++题解]结构体、排序
- C++类模版------STL的原理
- 数据结构拾遗(2) --红黑树的设计与实现(中)
- oracle集群数据库事务配置,在 .NET中使用Oracle数据库事务-安装配置-Oracle频道-中国IT实验室...
- 头部互金科技负责人领路知识图谱
- 如何快速搭建一个属于自己的网站?
- 记录下ES6踩过的坑
- 微型计算机乘法部件位于,组成原理复习题8.doc
- 清理谷歌浏览器注册表_注册表修改默认浏览器(建议Chrome)
- 论文笔记(1) B4: Experience with a Globally-Deployed Software Defined WAN
- html5+css3.5手机站标准写法,移动端手机网站基本模板
- 系统更新win10服务器出错怎么办,windows10更新升级失败0x80072ee2解决方法
- 什么是SEO,为什么要做SEO?
- 深入浅出对话系统——概述
- 小白攻略(一):数学建模是什么,为什么,怎样做?
- codeforces 1326 E.Bombs
- 电脑如何关闭445端口
- java封神OL_MobaXterm:远程终端登录软件封神选手