美文网首页组件化AndroidAndroid 开发
Android ARouter:最简单&粗暴(使用与原理

Android ARouter:最简单&粗暴(使用与原理

作者: Linhaojian | 来源:发表于2018-11-21 18:40 被阅读1834次

    1.前言

    • 组件化或者模块化开发模式,已逐渐成为热浪的形式,使用这些模式可以让我们程序更容易的扩展、更方便的维护
      更快捷的同步开发与更简单的单独调试,而ARouter的出现就是让组件间、模块间是实现完全的独立。
    • ARouter是:阿里巴巴自研路由框架,主要解决组件间、模块间的 界面跳转 问题。
    • 今天用最简单的方式讲解Arouter的使用与原理。
    • 文章中实例 linhaojian的Github

    2.目录

    arouter目录.png

    3.简介

    arouter简介.png

    4.原理

    4.1 关系分析

    • 从A界面跳转到B界面这个过程,我们看看arouter与界面间关系,如下图:


      arouter与界面关系.png
    • 1.注册

    B界面将类的信息,通过key-value的形式,注册到arouter中。

    • 2.查询

    A界面将类信息与额外信息(传输参数、跳转动画等),通过key传递至arouter中,并查询对应需要跳转类的信息。

    • 3.结合

    将A界面类信息、参数与B界面的类信息进行封装结合。

    • 4.跳转

    将结合后的信息,使用startActivity实现跳转。

    4.2 流程分析

    • A界面跳转到B界面,arouter做了以下工作:


      arouter流程.png

    从上图流程中,我们可以发现Arouter中原理:
    1.通过apt技术利用注解编译时生成类,封装目标界面类的类信息。
    2.在初始化时,把编译生成的类通过key-value的方式存储在arouter中。
    3.发送操作者通过key获取到目标界面类的信息。
    4.把发送操作者的信息与目标界面类信息进行结合或者关联在一起。
    5.实现跳转功能。

    • 其实简单概括:将需要相互跳转的界面信息传递至arouter中存储关联 & 实现跳转。

    5.使用

    5.1 跳转界面不带参

    • 发送跳转操作
    // 1. 普通跳转
    ARouter.getInstance().build("/test/activity").navigation();
    
    • 目标界面
    // 在支持路由的页面上添加注解(必选)
    // 这里的路径需要注意的是至少需要有两级,/xx/xx
    @Route(path = "/test/activity")
    public class YourActivity extend Activity {
        ...
    }
    

    5.2 跳转界面带参

    • 发送跳转操作
    ARouter.getInstance().build("/test/1")
                .withLong("key1", 666L)
                .withString("key3", "888")
                .withSerializable("key4", new Test("Jack", "Rose"))
                .navigation();
    
    • 目标界面
    @Route(path = "/test/1")
    public class YourActivity extend Activity {
        //获取数据三种方式
        //1.通过Autowired注解表明key   &  需要在onCreate中调用ARouter.getInstance().inject(this);配合使用
        @Autowired(name = "key1")
        public long data;
        //2.通过Autowired注解 & 将key1作为属性的名称   &  需要在onCreate中调用ARouter.getInstance().inject(this);配合使用
        @Autowired()
        public long key1;
        //3.通过Bundle获取
        getIntent().getExtras().getLong("key1")
    }
    

    5.3 跳转界面带参(传递Object)

    • 定义解析Obeject的SerializationService
    /**
     * 处理传递参数中自定义的Object---》withObject
     */
    @Route(path = "/custom/json")
    public class JsonSerializationService implements SerializationService {
        Gson gson;
        @Override
        public <T> T json2Object(String input, Class<T> clazz) {
            return gson.fromJson(input,clazz);
        }
        @Override
        public String object2Json(Object instance) {
            return gson.toJson(instance);
        }
        @Override
        public <T> T parseObject(String input, Type clazz) {
            return gson.fromJson(input,clazz);
        }
        @Override
        public void init(Context context) {
            gson = new Gson();
        }
    }
    
    • 发送跳转操作
    ARouter.getInstance().build("/test/1")
                .withObejct("key4", new Test("Jack", "Rose"))
                .navigation();
    
    • 目标界面
    @Route(path = "/test/1")
    public class YourActivity extend Activity {
        ...
        SerializationService serializationService = ARouter.getInstance().navigation(SerializationService.class);
        serializationService.init(this);
        User obj = serializationService.parseObject(getIntent().getStringExtra("key4"), User.class);
    }
    

    5.4 Uri跳转

    • 界面配置
    <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>
    
    • 发送跳转操作
     Uri testUriMix = Uri.parse("arouter://m.aliyun.com/test/activity2");
                    ARouter.getInstance().build(testUriMix)
                            .withString("key1", "value1")
                            .navigation();
    
    • 目标界面
    @Route(path = "/test/activity2")
    public class Test2Activity extends AppCompatActivity {
    }
    

    5.5 跳转结果监听

     ARouter.getInstance()
                  .build("/test/activity2")
                  .navigation(this, new NavCallback() {
                       @Override
                        public void onArrival(Postcard postcard) {
                         }
                         @Override
                         public void onInterrupt(Postcard postcard) {
                               Log.d("ARouter", "被拦截了");
                          }
                     });
    

    5.6 声明拦截器(拦截跳转过程,面向切面编程)

    // 比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查
    // 拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行
    @Interceptor(priority = 8, name = "测试用拦截器")
    public class TestInterceptor implements IInterceptor {
        @Override
        public void process(Postcard postcard, InterceptorCallback callback) {
        ...
        callback.onContinue(postcard);  // 处理完成,交还控制权
        // callback.onInterrupt(new RuntimeException("我觉得有点异常"));      // 觉得有问题,中断路由流程
        // 以上两种至少需要调用其中一种,否则不会继续路由
        }
        @Override
        public void init(Context context) {
        // 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次
        }
    }
    

    5.7 为目标页面声明更多信息

    // 我们经常需要在目标页面中配置一些属性,比方说"是否需要登陆"之类的
    // 可以通过 Route 注解中的 extras 属性进行扩展,这个属性是一个 int值,换句话说,单个int有4字节,也就是32位,可以配置32个开关
    // 剩下的可以自行发挥,通过字节操作可以标识32个开关,通过开关标记目标页面的一些属性,在拦截器中可以拿到这个标记进行业务逻辑判断
    @Route(path = "/test/activity", extras = Consts.XXXX)
    

    5.8 依赖注入解耦

    • 注册需要依赖注入的对象
    @Route(path = "/provider/testP")
    public class TestProvider implements IProvider {
        @Override
        public void init(Context context) {
        }
        public String test(){
           return ("Hello Provider!");
        }
    }
    
    • 获取对象 & 使用
    ARouter.getInstance().navigation(TestProvider.class).test();
    

    6.总结

    • 到此,ARouter就讲解完毕。
    • 如果喜欢我的分享,可以点击 关注 或者 ,你们支持是我分享的最大动力 。
    • linhaojian的Github

    欢迎关注linhaojian_CSDN博客或者linhaojian_简书

    不定期分享关于安卓开发的干货。


    写技术文章初心

    • 技术知识积累
    • 技术知识巩固
    • 技术知识分享
    • 技术知识交流

    相关文章

      网友评论

        本文标题:Android ARouter:最简单&粗暴(使用与原理

        本文链接:https://www.haomeiwen.com/subject/iqlkfqtx.html