美文网首页Android开发Android开发经验谈Android技术知识
Android:从零开始打造自己的深度链接库(一):ARoute

Android:从零开始打造自己的深度链接库(一):ARoute

作者: 珠穆朗玛小王子 | 来源:发表于2019-03-07 18:18 被阅读10次

    前言

    原计划这是一个系列的收费文章,2块钱买不了吃亏买不了上当,结果没想到预订人数还没到10人,略微有些尴尬。虽然结局不太完美,但是也反映出大家的水平大部分都在这篇文章的水平之上了,我也可以把文章拆分成多个部分慢慢写了,也是好事一件。

    在应用开发中,原生app经常内嵌Web,节省开发的成本,这种情况我们通过注入JS脚本来解决原生和Web的通信问题。那么相反,在浏览器环境中,Web又如何启动App呢?这就是深度链接的出现的原因。

    深度链接看着是一个很6的名字,实际上就是隐式启动的一种,所以说有文化就是不一样。隐式启动最大的优势在于不明确指定启动页面的名字,通过各种过滤参数,找到符合条件页面,对匹配的过程解耦,堪称路由模式的鼻祖。

    我们谈谈什么是路由模式?
    以生活中路由器为例,首先路由器连接可以访问网络的总线,我们通过网线或wifi连接路由器,当我们需要访问网络的时候,路由器帮助我们进行请求转发,访问网络有两种情况:
    1、例如看视频,聊天等等,访问的是总线;
    2、如果我们要打局域网游戏,就要访问连接同一路由的其他设备;

    那么把这种设计理念放入到程序设计中:

    总线 相当于主工程
    设备 相当于独立模块

    路由模式原型图

    再说说程序设计模块化的几大好处:

    1、便于多人协作开发,尽量避免多人操作同一文件,减少合并代码的引发的问题。
    2、便于测试,减少打包测试的时间
    3、便于维护,修改某一功能尽可能小的影响其他模块。

    模块化有这么多的好处,但同时出现了一个更大的问题:

    模块之间如何进行交互?###

    例如,用户登录和评论两个独立模块,评论之前需要判断是否已登录,否则要跳转到登录页面去,评论模块无法直接访问用户模块的类,所以无法正常编译运行,为了解决这个问题,我们需要借助路由模式。

    OK,基本知识我们已经都了解了,接下来我们学习一下ARouter的用法,看看他怎么把路由和深度链接结合起来的。

    正文

    ARouter路由github地址

    首先推荐大家看一下ARouter在github上的教程,英文版和中文版都有,可以说是非常良心了,这里我们挑几个重点介绍一下。

    @Router注解

    服务注解,用于Activity,Fragment,以及自定义服务接口等等。

    @Router注解的类,代表可以被路由的服务,例如跳转页面,启动服务,或者开放服务,例如之前举例的登录,就可以写一个LoginService,然后通过路由地址就可以找到这个服务。

    // 跳转页面
    @Route(path = "/main/TestActivity", extras = 1)
    public class TestActivity extends AppCompatActivity{}
    ARouter.getInstance().build("/main/TestActivity").navigation();
    
    // 通过路由找到Fragment
    @Route(path = "/test/fragment", extras = 1)
    public class Fragment1 extends Fragment{}
    Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
    
    // 通过路由找到开放的服务
    @Route(path = "/service/sayHello")
    public class HelloServiceImpl implements HelloService{}
    HelloService service4 = (HelloService)ARouter.getInstance().build("/service/sayHello").navigation();
    

    @Interceptor注解

    全局拦截器注解,会在编译过程中自动装配到ARouter配置中,无需手动设置

    拦截器会在路由过程中被执行,一旦某一个拦截器拦截,此次路由停止。如果跳转的过程想要跳过拦截器,可以设置greenChannel():

    // greenChannel()表示跳过拦截器
    ARouter.getInstance().build("/main/TestActivity").greenChannel().navigation();
    

    @Autowired注解

    自动装配注解,自动装配符合要求的值,例如从intent中或者通过路由创建对应的对象。

    ARouter.getInstance()
           .build("/kotlin/test")
           .withString("name", "老王")
           .withInt("age", 23)
           .navigation();
    
    // 自动装配,desc属性表示的描述,没有实际作用
    @Autowired(desc = "姓名")
    String name = "jack";
    
    @Autowired
    int age = 10;
    
    // 自动装配符合条件的服务
    // 如果有多个实现类,请设置路由地址
    // @Autowired(name = "/service/sayHello")
    @Autowired
    HelloService helloService;
    

    SchemeFilterActivity的使用

    深度链接过度页面,用于处理从浏览器跳转的参数,然后通过路由找到对应的服务。

    SchemeFilterActivity需要在Manifest.xml中注册,这和我们之前了解的深度链接完全一样,得到了地址后,交给ARouter处理,这样深度链接就和路由完美结合在一起使用。

    <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>
    
    public class SchemeFilterActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_schame_filter);
    
            Uri uri = getIntent().getData();
            ARouter.getInstance().build(uri).navigation();
            finish();
        }
    }
    

    总结

    这一篇主要是了解一些路由和深度链接相关的知识,然后了解一下ARouter的用法,为之后的源码分析和实战打下基础。

    下一篇:ARouter源分析,马上就来。

    如果你突然觉得这个系列值两块钱,那就打赏一下吧~

    相关文章

      网友评论

        本文标题:Android:从零开始打造自己的深度链接库(一):ARoute

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