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.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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容