ARouter框架使用总结及思考
ARouter框架不仅提供了强大的路由跳转功能,还有其他的能力。该框架对模块解耦,组件化设计提供了强有力的支持。
ARouter框架提供的具体功能包括Native页面跳转,URL页面跳转,获取Fragment,提供能力接口,拦截器等。
Native页面跳转
ARouter框架最基础的能力就是页面跳转。针对模块中支持外部模块跳转的页面,可以配置ARouter的注解,便于模块内外跳转到该页面。页面跳转的方法简明易用,不需要知道页面的class信息,避免模块间的耦合性。
1、普通的页面跳转
build的入参可以是build(String path)、build(String path, String group)(D eprecated,不建议使用)、build(Uri url)三种。ARouter的path一般包括两个层级"/group/pageName"。
传入参数Uri时,ARouter可以按照Uri的解析规则,获取Uri的path数据传入build函数。Uri解析规则如图
image.pngARouter.getInstance()
.build("test/activity2")
.navigation();
Uri uri = Uri.parse("http://www.xxxxx.com/test/activity2");
ARouter.getInstance()
.build(uri)
.navigation();
2、带参数页面跳转
可以通过with(bundle),withString(key, value)等传递数据。目标页面通过getIntent获取参数。
ARouter支持通过Autowired自动装配参数,框架来完成字段的赋值。
Bundle params = new Bundle();
ARouter.getInstance()
.build("/home/main")
.with(params)
.navigation();
3、支持startActivityForResult的页面跳转
navigation的第一个参数必须时Activity,第二个参数是requestCode。在Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)即可处理返回信息
ARouter.getInstance()
.build("/test/activity2")
.navigation(activityContext, requestCode);
4、NavigationCallback
可以通过NavigationCallback监控页面跳转的情况。
public interface NavigationCallback {
/**
* Callback when find the destination. 找到跳转路径时
*/
void onFound(Postcard postcard);
/**
* Callback after lose your way. 找不到跳转路径时
*/
void onLost(Postcard postcard);
/**
* Callback after navigation. 页面跳转成功后
*/
void onArrival(Postcard postcard);
/**
* Callback on interrupt. 页面跳转被拦截,未进行页面跳转
*/
void onInterrupt(Postcard postcard);
}
URL页面跳转
ARouter支持在h5页面中,通过URL直接跳转到原生页面。关于URL调起Intent的内容也可参考 为什么可以通过URL来调起APP - URL Scheme和Intent
// 创建一个类来监控Scheme事件,将Uri传给ARouter处理
public class SchameFilterActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
ARouter.getInstance().build(uri).navigation();
finish();
}
}
//在AndroidManifest中定义scheme
<activity android:name=".activity.SchameFilterActivity">
<!-- Schame -->
<intent-filter>
<data
android:host="m.aliyun.com"
android:scheme="arouter"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
//H5页面调用方式
<p><a href="arouter://m.aliyun.com/test/activity1">arouter://m.aliyun.com/test/activity1</a></p>
获取Fragment实例
可以通过对Fragment添加注解,后续通过ARouter获取Fragment实例。这对模块划分,APP壳工程开发,提供了便利性。
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
提供能力接口
ARouter支持模块通过声明接口来对外提供能力,获取数据等。首先通过定义IProvider的子接口,进而实现该子接口来提供能力。这个功能有助于实现模块之间的解耦。
接口支持同步回调,也可以使用callback参数进行异步回调。在考虑组件化开发中,和同事讨论如何避免不同模块之间传递数据结构,暂定采用json来在传输。后续的设想是调研跨模块数据结构传输方案,参考aidl。
不过也可通过提供多个能力接口来避免复杂的数据结构传输。
// Declaration interface, other components get the service instance through the interface
public interface HelloService extends IProvider {
String sayHello(String name);
}
@Route(path = "/service/hello", name = "test service")
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "hello, " + name;
}
@Override
public void init(Context context) {
}
}
使用方可通过依赖注入,通过路径或接口类名来获取接口实例,进而提供服务。
helloService3 = ARouter.getInstance().navigation(HelloService.class);
helloService4 = (HelloService) ARouter.getInstance().build("/service/hello").navigation();