Android开发经典问题方案

ARouter框架使用总结及思考

2018-08-27  本文已影响1009人  zizi192

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.png
ARouter.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();

参考文档
为什么可以通过URL来调起APP - URL Scheme和Intent

上一篇下一篇

猜你喜欢

热点阅读