文档章节

ARouter 源码历险记 (五)

街角的小丑
 街角的小丑
发布于 2017/04/18 16:10
字数 668
阅读 102
收藏 0

目录

ARouter 源码历险记 (一)

ARouter 源码历险记 (二)

ARouter 源码历险记 (三)

ARouter 源码历险记 (四)

ARouter 源码历险记 (五)

前言

    本来ARouter的内容已经分析完了,到第四篇就应该结束了,但是今天上github查看版本发现更新很频繁,对比了下代码,除了细微处的修改,主要还是增加了几个非常有用的功能,所以打算继续深入研究下。

转场动画

    在Postcard中增加了两个方法

public Postcard withTransition(int enterAnim, int exitAnim) {
        this.enterAnim = enterAnim;
        this.exitAnim = exitAnim;
        return this;
    }

    /**
     * Set options compat
     *
     * @param compat compat
     * @return this
     */
    @RequiresApi(16)
    public Postcard withOptionsCompat(ActivityOptionsCompat compat) {
        if (null != compat) {
            this.optionsCompat = compat.toBundle();
        }
        return this;
    }

    使用方法和设置参数类似

// 转场动画(常规方式)
ARouter.getInstance()
    .build("/test/activity2")
    .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
    .navigation(this);

// 转场动画(API16+)
ActivityOptionsCompat compat = ActivityOptionsCompat.
    makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);

// ps. makeSceneTransitionAnimation 使用共享元素的时候,需要在navigation方法中传入当前Activity

    使用原理也相对比较简单,

private Object _navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
        final Context currentContext = null == context ? mContext : context;

        switch (postcard.getType()) {
            case ACTIVITY:
...........
                // Navigation in main looper.
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        if (requestCode > 0) {  // Need start for result
                            ActivityCompat.startActivityForResult((Activity) currentContext, intent, requestCode, postcard.getOptionsBundle());
                        } else {
                            ActivityCompat.startActivity(currentContext, intent, postcard.getOptionsBundle());
                        }

                        if ((0 != postcard.getEnterAnim() || 0 != postcard.getExitAnim()) && currentContext instanceof Activity) {    // Old version.
                            ((Activity) currentContext).overridePendingTransition(postcard.getEnterAnim(), postcard.getExitAnim());
                        }
.........
                    }
                });
........
}

    在调用真正跳转的使用,直接传入动画就完成了。

Fragment支持

    在之前的版本(前面博文中分析的)中,ARouter是不支持Route Fragment的。如今,在RouteProcessor中添加了对Fragment的支持

if (types.isSubtype(tm, fragmentTm) || types.isSubtype(tm, fragmentTmV4)) {
                    logger.info(">>> Found fragment route: " + tm.toString() + " <<<");
                    routeMete = new RouteMeta(route, element, RouteType.parse(FRAGMENT), null);
                }

    和IProvider以及Service一样,没有和activity一样的Autowired参数map,这是可以理解的,因为Activity的autowired参数表的作用是列出所有需要被注入参数的类型,在使用uri跳转的时候,根据类型进行参数注入。由于frament是没有uri跳转的,所以同样不需要参数表。

    于是当我们给Fragment添加上@Route注解之后,我们可以在Group文件中出现如下代码:

atlas.put("/test/fragment", RouteMeta.build(RouteType.FRAGMENT, BlankFragment.class, "/test/fragment", "test", null, -1, -2147483648));

    然后在和activity类似,调用navigation,不过不同的是,activity会直接启动,而fragment会返回一个实例,如下:

case FRAGMENT:
                Class fragmentMeta = postcard.getDestination();
                try {
                    Object instance = fragmentMeta.getConstructor().newInstance();
                    if (instance instanceof Fragment) {
                        ((Fragment) instance).setArguments(postcard.getExtras());
                    } else if (instance instanceof android.support.v4.app.Fragment) {
                        ((android.support.v4.app.Fragment) instance).setArguments(postcard.getExtras());
                    }

                    return instance;
                } catch (Exception ex) {
                    logger.error(Consts.TAG, "Fetch fragment instance error, " + TextUtils.formatStackTrace(ex.getStackTrace()));
                }

    调用默认构造函数创建实例,然后放入arguments。

Autowired类型扩展

    增加了Autowired中 Parcelable对象和 普通对象支持。分别通过getParcelableExtra的方式注入和通过json2Object的方式注入。

© 著作权归作者所有

街角的小丑
粉丝 8
博文 118
码字总数 217248
作品 0
杭州
私信 提问
转让3个cocos2dx游戏源码

由于资金短缺,只卖美术成本价,都已经上线appstore了,有需要得联系qq 476855582 ,3个都已经接了admob广告~需要的联系,只卖美术费!!![美食消消看 ] [喵星历险记] [史上最困难的2...

cocos2dx渣渣
2014/10/02
335
0
组件化知识梳理(2) - Arouter 源码分析之 Complier SDK

组件化知识梳理目录 组件化知识梳理(1) - Arouter 的基本使用 组件化知识梳理(2) - Arouter 源码分析之 Complier SDK 组件化知识梳理(3) - Arouter 源码分析之运行时 SDK 一、概述 在的源码 ...

泽毛
2018/04/13
0
0
ARouter解析七:降级策略

今天我们接着来学习下阿里今年开源的路由框架ARouter,这个也是我们这个解析系列内容的最后一篇了,后面还会一片总结的分享。今天分享下ARouter的降级策略。 那么降级策略是个什么鬼?使用系...

微笑的江豚
2018/01/25
148
0
Android组件化开发的简单应用

组件化开发的主要步骤: 一、新建Modules 1、新建Project,作为应用的主Module。 2、新建Module:"Common",类型选择"Android Library",作为所有其它Module的基础依赖库。 3、新建Module:"Hom......

milovetingting
02/28
0
0
Open Library 项目

Open Library是一个工具性网站,目标是提供全世界所有书籍的书目信息,也就是为每一本书创建一个主页。它是一个开放性网站,所有人都可以自由地编辑。目前,这个网站还处在试验性的beta阶段。...

阮一峰
2007/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部