Android-ARouter组件化

项目运行到一定程度,功能和人员都会越来越多,另外对于我们公司项目,还出现了多个App有部分业务流程一样的情况。针对这种问题,除了使用私有库的方式抽取公共模块外,还可以通过组件化(也有地方称为模块化)的方式来进行解耦。

针对我们项目的实际情况,有以下目标要求:

  1. 各个模块可以单独开发,不需要等待其他功能开发完成。
  2. 公共的业务流程代码迁移方便。
  3. 能够控制流程,比如一个页面需要登录才能进入。
  4. 页面可以很方便跳转,比如可以通过支持字符串跳转。
  5. 因为我们项目有部分页面使用了Kotlin,所以需要支持Kotlin。

经过调研,发现ARouter能很好的解决我们上面的痛点。ARouter网上的资料已经很完善了,下面主要讲讲,针对我们项目,我们是如何使用它的。

页面跳转

  1. 定义路由格式:为了避免页面路由冲突,定义路由格式:当前Module名字+当前文件名
    通过配置gradle,让当前Module名字自动生成
buildConfigField("String",
        "MODULE_SHORT_NAME",
        "\""+(project.getName().substring(project.getName().lastIndexOf(".") + 1))+"\"")
  1. 配置页面路由:
@Route(path = "/" + BuildConfig.MODULE_SHORT_NAME + "/XXXActivity")
public class XXXActivity extends BaseActivity {
  /***/
}
  1. 定义公共路由配置文件
public interface RouterConstant {

    /*其他Module*/

    // MODULE_NAME 改成自己Module名字
    interface MODULE_NAME {
        // MODULE_SHORT_NAME改成自己Module名字
        String BASE = "/MODULE_SHORT_NAME/";
        // XXXActivity改成自己Activity名字
        String XXX = BASE + "XXXActivity";
    }
}
  1. 页面跳转
    根据第3步定义的配置文件获取配置,最终跳转页面XXXActivity2。
ARouter.getInstance()
            .build(RouterConstant.MODULE_NAME.XXX)
            .navigation(XXXActivity2.this);

页面跳转拦截器

IInterceptor一旦定义,页面跳转的时候都会进入拦截器,所以需要在拦截器中判断是否真的要进入拦截器。

@Interceptor(priority = 1, name = "登录拦截器")
public class LoginIInterceptor implements IInterceptor {
    
    public static final String IS_CHECK_LOGIN = "IS_CHECK_LOGIN";
    private Postcard postcard;
    private InterceptorCallback callback;
    private Context context;

    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {

        if (callback != null) {
            if (postcard != null && postcard.getExtras() != null) {

                // 判断是否需要检查登录
                boolean isCheckLogin = postcard.getExtras().getBoolean(IS_CHECK_LOGIN);

                try {
                    // 如果需要检查登录 而且 当前没有登录
                    if (isCheckLogin && !LoginInfoManager.isLogin(context)) {

                        // 暂存跳转数据和回调流程
                        this.postcard = postcard;
                        this.callback = callback;

                        // 跳转登录页面
                        ARouterWrapper.build(RouterConstant.LOGIN.LOGIN)
                                .withFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP)
                                .navigation(context, new NavCallback() {
                                    @Override
                                    public void onArrival(Postcard postcard) {

                                    }
                                });
                        return;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    callback.onContinue(postcard);
                }

            }
        }
        // 处理完成,交还控制权
        callback.onContinue(postcard);
    }

    @Override
    public void init(Context context) {
        this.context = context;
        // 添加登录成功消息监听
        EventBus.getDefault().register(this);
    }

    @Subscribe
    public void onEventBusReceive(EventBusHandler eventBusHandler) {
        /*判断消息类型*/
        /*处理逻辑*/
        /*释放对象*/
    }
}

在要检查登录的页面跳转的时候,添加参数”IS_CHECK_LOGIN“。在拦截器里面判断是否需要验证登录,如果需要验证登录而且当前没有登录,跳转登录页面。登录成功后通过EventBus发送消息,在拦截器里面进行监听,处理相关业务逻辑,继续之前的操作。其他拦截器的逻辑也是类似处理流程,这里就不展开了。

提供程序接口IProvider

当项目中出现下面情况的时候,IProvider就派上用场了。

  • A Module需要调用或者使用 B Module里面的方法
  1. 在项目公共配置里面定义IProvider
public interface XXXProvider extends IProvider {
    View createSomeView(Context context);
    void doSometing();
}
  1. 在具体的Module里面实现XXXProvider
@Route(path = "/" + BuildConfig.MODULE_SHORT_NAME + "/XXXProviderImpl")
public class XXXProviderImpl implements XXXProvider {

    @Override
    public View createSomeView(Context context) {
        /*创建View返回*/
    }

    @Override
    public void doSometing() {
        /*处理逻辑*/
    }
}
  1. 调用XXXProvider里面方法
    // 通过注解获取对象provider,调用XXXProvider里面方法
    @Autowired
    XXXProvider provider;

通过上面处理,最终App结构如下:


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • 在App开发的初期,代码量不大,业务量比较少,一个App作为一个单独的模块进行开发,往往问题不大。但随着业务的增多...
    AC编程阅读 4,965评论 3 30
  • 1. App项目组件化 做移动开发的同学都会发现这两年在移动开发圈子里最火的就是组件化了,组件化不同的实现方案也引...
    monkey01阅读 10,554评论 6 56
  • 上集回顾 上一篇文章解说了模块化以及组件,插件化的概念。模块化是一种解决项目分层的思想,组件化和插件化分别是其不同...
    DevCW阅读 3,780评论 6 45
  • 本文意在快速集成并掌握阿里Android技术团队开源的一款路由框架。这款路由框架可以为我们的应用开发提供更好更丰富...
    kven3574阅读 376评论 0 2
  • 数不清自己是第几次自己一个人坐在电影院的售票厅 等着电影开始了 来往的人 有散场回家的 也有匆忙赶场的 没有意外 ...
    卜叻阅读 499评论 0 0