AndroidRouter: https://github.com/JasmineBen/AndroidRouter
AndroidRouter是一款路由框架,用于实现个模块之间的Activity跳转。本文基于注解、编译时字节码修改等技术实现了一款路由,实现了一款可用于组件化开发的路由框架,通过如下方式定义路由:
@Route(authority="sampleAuthority",path="samplePath",desc="sampleDesc")
通过如下方式进行跳转:
Router.getInstance().openScheme(activity,url,bundleData,requestCode)
跳转的时候参数不再需要使用者自己通过Intent方式传输,直接写在url中即可。
使用方式:
1、集成组件
dependencies {
api 'com.conan.router:router-anno:1.0.1'
annotationProcessor 'com.conan.router:router-compiler:1.0.1'
api 'com.conan.router:router-lib:1.0.1'
}
router{
routerImpl='com.conan.router.samples.SampleRouter'
}
2、定义target路由
@Route(authority = "app",path = "MainActivity2",desc = "MainActivity2")
public class MainActivity2 extends AppCompatActivity {
@Inject(name = "")
String name;
@Inject(name = "age")
String age;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
InjectService.inject(this);
TextView tv = findViewById(com.conan.router.samples.R.id.text);
tv.setText(name+":"+age);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Router.getInstance().openScheme(MainActivity2.this,"router://app/MainActivity3?name1=MainActivity3&age1=1800",null,-1);
}
});
}
}
在定义路由时,通过@Route定义authority,path信息,通过@Inject完成Intent中参数的注入,注意@inject定义的值必须在路由的scheme中;同一个module最好使用同一个authority,相同的authority不能使用相同的path;不同的module需要使用不同的authority。
3、注册路由
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
Router.getInstance().addBaseRouterImpl("com.conan.router.AppRouter");
SamplesApplicationLike.getInstance().onCreate();
}
}
4、路由跳转
Router.getInstance().openScheme(MainActivity.this,"router://sample/SampleActivity?sampleName=sample&sampleAge=18",null,-1);
AndroidRouter的使用分为4步:集成组件、定义路由、注册路由、路由跳转(简单吧)。
注意:第1步的routerImpl和第3步的addBaseRouterImpl定义的路由实现类需要是一致的。
组件化支持
为了支持组件化,子module中需要除了以上4步之外,还需要提供一个入口类,用于注册子模块的路由,如下所示:
public class SamplesApplicationLike {
private static SamplesApplicationLike mInstance = new SamplesApplicationLike();
private SamplesApplicationLike(){}
public static SamplesApplicationLike getInstance(){
return mInstance;
}
public void onCreate(){
Router.getInstance().addBaseRouterImpl("com.conan.router.samples.SampleRouter");
}
}
在app的Application中需要调用子模块的注册路由方法,这样主模块就能访问到子模块的路由信息,子模块也可以访问到主模块的路由。
总结
AndroidModule比较小巧,使用简单,且可以应用于组件化开发。