一、路由介绍
1.定义:
ARouter是阿里巴巴自研路由框架,主要解决组件间、模块间的界面跳转问题.
2.为啥使用ARouter?
从使用场景分析:
2.1
动态跳转:一般来说复杂的电商跳转多页面需要很强的灵活性,很多情况下是运营人员动态配置的下发活动页面,需要灵活的进行跳转.
2.2
组件化:随着业务量的不断增长,app也会越来越大,开发团队的规模和工作量也会逐渐增大,面对所衍生的64K问题、协作开发问题等,app一般都会走向组件化。组件化就是将APP按照一定的功能和业务拆分成多个组件module,不同的组件独立开发,组件化不仅能够提供团队的工作效率,还能够提高应用性能。而组件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系.
2.3
Native与H5的问题:现在的APP很少是纯Native的,也很少会有纯H5的,一般情况下都是将两者进行结合。这时候就需要非常便捷并且统一的跳转方案,因为在H5中是无法使用StartActivity()跳转到Native页面的,而从Native跳转到H5页面也只能通过配置浏览器的方式实现.
2.4
其他场景分析: 原生跳转方式的不足
2.4.1
显式跳转:Intent intent = new Intent(activity, XXActivity.class); 由于需要直接持有对应class,从而导致了强依赖关系,提高了耦合度.
2.4.2
隐式跳转:譬如 Intent intent = new Intent(); intent.setAction(“com.android.activity.MY_ACTION”);
action等属性的定义在Manifest,导致了扩展性较差
规则集中式管理,导致协作变得非常困难.
2.4.3
原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivity()就无法插手其中任何环节了,只能交给系统管理,这就导致了在跳转失败的情况下无法降级,而是会直接抛出运行时的异常.
二:ARouter的使用如下:
在各个模块的build.gradle中添加编译参数和依赖的框架
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 3.0以上的需要把compile换成implementation匹配使用,均使用最新版可以保证兼容
implementation fileTree(dir: 'libs', include: ['*.jar']
implementation 'com.alibaba:arouter-api:1.4.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
...
}
我的项目build配置截图如下
2.初始化sdk:
Application代码如下:
/**
* 作者: njb
* 时间: 2018/5/30 0030-上午 11:29
* 描述: Application
* 来源:
*/
public class App extends BaseApplication {
private boolean debug = true;
@Override
public void onCreate() {
super.onCreate();
initARouter();
}
@Override
protected String getBaseUrl() {
return null;
}
private void initARouter() {
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(this); // 尽可能早,推荐在Application中初始化
}
public boolean isDebug() {
return debug;
}
}
3.添加注解:
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/chat/main")
public class MainActivity extends AppCompatActivity {
private TextView text;
@Autowired
public String key3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
ARouter.getInstance().inject(this);
Toast.makeText(this, "收到传送过来的数据:" + key3, Toast.LENGTH_LONG).show();
text = findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
}
4.路由操作:
4.1在Activity中的跳转如下:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.chat_tv:
ARouter.getInstance().build("/chat/main")
.withLong("key1", 77878L)
.withString("key3", "334455")
.navigation();
break;
case R.id.contract_tv:
ARouter.getInstance().build("/home/main")
.withString("userone","张龙")
.withString("usertwo","赵虎")
.withString("userthree","马超")
.navigation();
break;
case R.id.find_tv:
ARouter.getInstance().build("/find/main")
.withString("name","张三")
.withString("title","今日进入热搜头条")
.withString("content","内容太过真实,吴京带小板凳坐火车,看样子买的是站票")
.navigation();
break;
case R.id.mine_tv:
ARouter.getInstance().build("/mine/main")
.withString("nickname","你是我的眼")
.withString("height","188")
.withString("age","26")
.withString("fans","33")
.withString("follow","5")
.withString("zan","10")
.navigation();
break;
case R.id.say_hello_tv:
Toast.makeText(this, baseService.sayHello("开始聊天"), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
4.2 在Fragment中的跳转如下:
5.通过依赖注入解耦:服务管理(一) 暴露服务
/**
* 作者: njb
* 时间: 2018/5/30 0030-上午 11:29
* 描述: 接口为各个组件间通讯的代理接口,继承了 @IProvider
* 各个组件要暴露方法时可以继承在commonlib 里创建的接口并实现方法
* 来源:
*/
public interface HomeExportService extends IProvider {
String sayHello(String s);
}
6.通过依赖注入解耦:服务管理(二) 发现服务
@Autowired(name = "/home/HomeService")
public HomeExportService baseService;
总结:官方的文档Github很详细小伙伴们可以去看看,以上ARouter的简单使用,写得不好还望大家多多见谅.