前言
原计划这是一个系列的收费文章,2块钱买不了吃亏买不了上当,结果没想到预订人数还没到10人,略微有些尴尬。虽然结局不太完美,但是也反映出大家的水平大部分都在这篇文章的水平之上了,我也可以把文章拆分成多个部分慢慢写了,也是好事一件。
在应用开发中,原生app经常内嵌Web,节省开发的成本,这种情况我们通过注入JS脚本来解决原生和Web的通信问题。那么相反,在浏览器环境中,Web又如何启动App呢?这就是深度链接的出现的原因。
深度链接看着是一个很6的名字,实际上就是隐式启动的一种,所以说有文化就是不一样。隐式启动最大的优势在于不明确指定启动页面的名字,通过各种过滤参数,找到符合条件页面,对匹配的过程解耦,堪称路由模式的鼻祖。
我们谈谈什么是路由模式?
以生活中路由器为例,首先路由器连接可以访问网络的总线,我们通过网线或wifi连接路由器,当我们需要访问网络的时候,路由器帮助我们进行请求转发,访问网络有两种情况:
1、例如看视频,聊天等等,访问的是总线;
2、如果我们要打局域网游戏,就要访问连接同一路由的其他设备;
那么把这种设计理念放入到程序设计中:
路由模式原型图总线 相当于主工程
设备 相当于独立模块
再说说程序设计模块化的几大好处:
1、便于多人协作开发,尽量避免多人操作同一文件,减少合并代码的引发的问题。
2、便于测试,减少打包测试的时间
3、便于维护,修改某一功能尽可能小的影响其他模块。
模块化有这么多的好处,但同时出现了一个更大的问题:
模块之间如何进行交互?###
例如,用户登录和评论两个独立模块,评论之前需要判断是否已登录,否则要跳转到登录页面去,评论模块无法直接访问用户模块的类,所以无法正常编译运行,为了解决这个问题,我们需要借助路由模式。
OK,基本知识我们已经都了解了,接下来我们学习一下ARouter的用法,看看他怎么把路由和深度链接结合起来的。
正文
首先推荐大家看一下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源分析,马上就来。
如果你突然觉得这个系列值两块钱,那就打赏一下吧~
网友评论