上一篇文章咱们谈到了如何实现一个路由库,那本篇文章就给你们推荐一个好用的路由库,来确认下眼神,这就是你要的路由库。java
EasyRouter:一个简单、稳定、强大、高性能的组件化路由框架。github地址:https://github.com/liuzhao2007/EasyRouter。android
欢迎使用、star、fork、pr。git
经过url打开Activity,实现界面间解耦;github
经过服务实现方法调用,实现Module间方法调用解耦;api
经过拦截器实现界面跳转的处理:条件拦截、埋点统计等;bash
界面、服务、拦截器均支持多Module;微信
基于编译时注解,界面、服务、拦截器等都可自动注册;app
可传递Bundle支持的全部数据类型;框架
支持自动注入参数到目标界面;maven
支持获取Fragment;
支持全局、局部过程监听:降级、打开后等;
Api简单、实现高性能;
Module内、跨Module界面跳转,界面解耦;
界面跳转过程拦截:条件拦截(eg:未登陆)、重定向等;
跨Module方法调用,Module间解耦;
外部Url跳转应用内界面;
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
compile 'com.easyrouter:router-api:1.2.3'
compile 'com.easyrouter:router-annotation:1.2.3'
annotationProcessor 'com.easyrouter:router-compiler:1.2.3'
}
复制代码
在Project级别的build.gradle中添加:
allprojects {
repositories {
jcenter()
maven { url "https://dl.bintray.com/liuzhaowy2007/maven" }
}
}
复制代码
EasyRouterConfig.getInstance().setScheme()必调,别的设置选调;
EasyRouterConfig.getInstance()
.setDebug(true)
.setScheme("easyrouter")
.setDefaultRouterCallBack(new IRouterCallBack() {
@Override
public void onFound() {
LogUtil.i("default onFound");
}
@Override
public void onLost() {
LogUtil.i("default onLost");
}
@Override
public void onOpenSuccess() {
LogUtil.i("default onOpenSuccess");
}
@Override
public void onOpenFailed() {
LogUtil.i("default onOpenFailed");
}
})
.init(EasyRouterApp.this);
复制代码
例如:@DispatcherModules({"app","moduleinteract"});
复制代码
@DisPatcher({"easyrouter://main", "easyrouter://maintwo"})
public class MainActivity extends Activity
复制代码
1. EasyRouter.open("easyrouter://main");//方式一
2. EasyRouter.with("easyrouter://main").open();//方式二
复制代码
EasyRouter.with("easyrouter://main").withString("stringparams","")// 传递基本数据类型;
.withParcelable("parcelable",null)// 传递系列化对象;
.withFlags(Intent.FLAG_ACTIVITY_NEW_TASK)// 设置Flag;
.withTransition(0,0)// 设置动画;
.open(Activity,requestCode);// 设置RequestCode
复制代码
EasyRouter.open("easyrouter://main?name=liuzhao&sex=man");
这样传递了两个参数:name与sex;在目标Activity中能够经过getIntent.getString("name")方式来获取;
复制代码
注解声明:
@DisPatcher({"easyrouter://main/i:tab"}) // 注解声明须要一个必备参数tab,而且声明其类型为int;
public class MainActivity extends Activity
调用:
EasyRouter.open("easyrouter://main/3");
这样传递了一个参数:tab;在目标Activity中能够经过getIntent.getInt("tab",0)方式来获取;
复制代码
备注:必须参数与非必须参数可搭配使用,区别在于必须参数参与url匹配过程;经过url传参与不经过url传参两种方式可搭配使用。
配置稍微复杂,但使用极其简单;可参考modulelib中的BaseModuleService。
在项目的Library中建立继承IBaseModuleService的接口文件com.android.easyrouter.service.BaseModuleService;(包名、类名及继承关系不可变)
各Module须要向外提供的方法在BaseModuleService中新建接口类并暴露接口;
public interface ModuleInteractService extends BaseModuleService {
void runModuleInteract(Context context);
}
复制代码
在Module中建立Module的接口实现类,类名须要和接口名同样;
打上注解@ModuleService、并编译;
在别的Module中直接以方法调用;
EasyRouter.getModuleService(BaseModuleService.ModuleInteractService.class).runModuleInteract(context);
复制代码
备注:配置复杂带来的优点是方法的直接调用,无需强转也不限定调用方法的方法签名;
实现IInterceptor接口;
打上注解@Interceptor;
@Interceptor
public class RouterTestInterceptor implements IInterceptor{
@Override
public boolean intercept() {
LogUtil.i("intercept by me");
return true;// if true intercept; false go on;
}
@Override
public void onIntercepted() {
}
}
复制代码
备注:在intercept方法中进行拦截与否的判断,例如登陆态、重定向等;
EasyRouter.open("easyrouter://routertest",new IRouterCallBack(){
@Override
public void onFound() {
//匹配到
}
@Override
public void onLost() {
//匹配不到,可作降级;
}
@Override
public void onOpenSuccess() {
//界面打开成功
}
@Override
public void onOpenFailed() {
//界面打开失败,可作降级;
}
});
复制代码
备注:能够对每一次路由作监听,也能够设置全局默认的监听;
EasyRouter.init(EasyRouterApp.this).setScheme("easyrouter").setDefaultRouterCallBack();
复制代码
// 传入Fragment继承的类,android.app.Fragment或者android.support.v4.app.Fragment
Fragment fragment = EasyRouter.with("easyrouter://fragmenttest").getFragment(Fragment.class);
复制代码
AndroidManifest.xml中注册
<activity
android:name="com.android.easyrouter.url.EasyRouterUrlActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="easyrouter" /><!--改为本身的Scheme-->
</intent-filter>
</activity>
复制代码
备注:也可使用本身的Activity:
只须要调用EasyRouter.open(Uri.toString());便可
在目标Activity中加上EasyRouter.inject(this);
在Activity中须要自动传参的参数上加上注解@AutoAssign,则会自动经过Intent赋值。例如:
@AutoAssign
long time;
@AutoAssign
int age;
@AutoAssign
String url;
复制代码
备注:自动注入参数功能目前仅支持基本数据类型和String;
今日头条各Android客户端团队招人火爆进行中,各个级别和应届实习生都须要,业务增加快、日活高、挑战大、待遇给力,各位大佬走过路过千万不要错过!
本科以上学历、非频繁跳槽(如两年两跳),欢迎加个人微信详聊:KOBE8242011