##1.前言
组件化或者模块化开发模式,已逐渐成为热浪的形式,使用这些模式可以让我们程序更容易的扩展、更方便的维护
更快捷的同步开发与更简单的单独调试,而ARouter的出现就是让组件间、模块间是实现完全的独立。
ARouter是:阿里巴巴自研路由框架,主要解决组件间、模块间的 界面跳转 问题。
今天用最简单的方式讲解Arouter的实现原理。
以下是我在学习网易公开课做的笔记,想学习可以百度搜索一下,我最近刚花钱买了个微专业学习,提升自己中,自我感觉不错,哈哈,不是打广告哈(我也没什么人气…)
##2.组件化搭建
这里我就不描述组件化怎么搭建了,我给大家推荐一篇文章(这是鸿阳公众号的一篇文章)手把手带你 实践组件化
##3.自定义超低配ARouter
组件化搭建好后:
我们居然要实现不同组件的跳转,我们肯定需要一个"中间人",这里我创建了一个module,命名为arouter,这里分别定义了两个类Arouter和IArouter代码如下:
1.Arouter
package com.yike.arouter;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import dalvik.system.DexFile;
import java.util.*;
/**
* Author:wangcaiwen
* Date:2019-07-16
* Description:中间人 代理
*/
public class Arouter {
private static Arouter arouter= new Arouter();
private Context context;
private static final String TAG = "Arouter";
public void init(Application context){
this.context = context;
//这里主要是为了获取通过注解在包名:com.yike.util 下自动生成所有类,
List<String> classNmaes = getClassNmae("com.yike.util");
for (String classNmae : classNmaes) {
Log.e(TAG, "init: "+classNmae );
try {
Class<?> aClass = Class.forName(classNmae);
//判断这个类是否是IRouter的实现类
//如果是IArouter的实现类
if (IArouter.class.isAssignableFrom(aClass)){
IArouter iArouter = (IArouter) aClass.newInstance();
iArouter.putActivity();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 装载所有的activity的类对象的容器
*/
private Map<String,Class<? extends Activity>> activityList;
public Arouter() {
activityList = new HashMap<>();
}
public static Arouter getInstance(){
return arouter;
}
/**
* 将activity的类对象,添加进map
* @param path 这里参数就是我们定义的路由地址 格式如:(/user/login)
* @param clazz 这个就是我们需要跳转的activity 也就是说:/user/login-->LoginActivity
*/
public void putActivity(String path,Class<? extends Activity> clazz){
if (path!=null&&clazz!=null){
activityList.put(path, clazz);
}
}
/**
* 跳转页面调用的方法
* @param key
* @param bundle
*/
public void jumpActivity(String key, Bundle bundle){
//取出路由地址对应的activity类
Class<? extends Activity> aClass = activityList.get(key);
if (aClass==null){
return;
}
Intent intent