上一篇文章我们谈到了如何实现一个路由库,那本篇文章就给大家推荐一个好用的路由库,来确认下眼神,这就是你要的路由库。
EasyRouter:一个简单、稳定、强大、高性能的组件化路由框架。github地址:https://github.com/liuzhao2007/EasyRouter。
欢迎使用、star、fork、pr。
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。
public interface ModuleInteractService extends BaseModuleService {
void runModuleInteract(Context context);
}
EasyRouter.getModuleService(BaseModuleService.ModuleInteractService.class).runModuleInteract(context);
备注:配置复杂带来的优势是方法的直接调用,无需强转也不限定调用方法的方法签名;
@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());即可
@AutoAssign
long time;
@AutoAssign
int age;
@AutoAssign
String url;
备注:自动注入参数功能目前仅支持基本数据类型和String;