10.2.使用Aroute解耦

依赖图

后期补充

使用流程

在根工程的build.gradle中添加aroute插件依赖

build.gradle

buildscript {
    ...
    dependencies {
        ...
        //ARouter插件依赖
        classpath "com.alibaba:arouter-register:1.0.2"
    }
}

在模块的build.gradle中添加aroute插件

ft_login/build.gradle

apply plugin: 'com.alibaba.arouter'
...

配置aroute,告诉aroute我们工程的名字

ft_login/build.gradle

...
apply plugin: 'com.alibaba.arouter'

android {
    ...
    defaultConfig {
        ...
        //ARouter配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]
            }
        }
    }
}

引入aroute的依赖

ft_login/build.gradle

apply plugin: 'com.alibaba.arouter'

android {
    ...
    defaultConfig {
        ...
        //ARouter配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]
            }
        }
    }
}

dependencies {
    ...
    //arouter库
    implementation(rootProject.depsLibs.arouterapi) {
        exclude group: 'com.android.support'
    }
    annotationProcessor rootProject.depsLibs.aroutercompiler
}

在lib_base中定义接口

lib_base/src/main/java/com/moluo/lib_base/ft_login/service/LoginService.java

package com.moluo.lib_base.ft_login.service;

import android.content.Context;

import com.alibaba.android.arouter.facade.template.IProvider;
import com.moluo.lib_base.ft_login.model.user.User;

/**
 * Login模块对外提供的所有功能
 *
 * @author moluo
 * @since 2020/11/15
 */
public interface LoginService extends IProvider {
    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    User getUserInfo();

    /**
     * 移除用户信息
     */
    void removeUser();

    /**
     * 是否登录
     *
     * @return true表示已经登录,false表示未登录
     */
    boolean hasLogin();

    /**
     * 跳转到登录页面
     *
     * @param context 上下文
     */
    void login(Context context);

}

在ft_login中实现接口,注册组件到Aroute中

ft_login/src/main/java/com/moluo/ft_login/service/LoginServiceImpl.java

package com.moluo.ft_login.service;

import android.content.Context;
import android.util.Log;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.moluo.ft_login.LoginActivity;
import com.moluo.ft_login.manager.UserManager;
import com.moluo.lib_base.ft_login.model.user.User;
import com.moluo.lib_base.ft_login.service.LoginService;

/**
 * 登录模块对外接口功能实现
 *
 * @author moluo
 * @since 2020/11/15
 */
@Route(path = "/login/login_service")
public class LoginServiceImpl implements LoginService {
    @Override
    public User getUserInfo() {
        return UserManager.getInstance().getUser();
    }

    @Override
    public void removeUser() {
        UserManager.getInstance().removeUser();
    }

    @Override
    public boolean hasLogin() {
        return UserManager.getInstance().hasLogined();
    }

    @Override
    public void login(Context context) {
        LoginActivity.start(context);
    }

    @Override
    public void init(Context context) {
        Log.i(LoginServiceImpl.class.getSimpleName(), "init()");
    }
}

使用注册到Aroute中的组件

为方便使用,在lib_base中对LoginService进行包装,这样业务模块就可以无需知道Login模块的URL及对其进行初始化,当然你也可以不这样做。 lib_base/src/main/java/com/moluo/lib_base/ft_login/service/impl/LoginImpl.java

package com.moluo.lib_base.ft_login.service.impl;

import android.content.Context;

import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.launcher.ARouter;
import com.moluo.lib_base.ft_login.model.user.User;
import com.moluo.lib_base.ft_login.service.LoginService;

/**
 * 对{@link LoginService}包装,业务方直接调用,无需再自己初始化service类
 */
public class LoginImpl {

    @Autowired(name = "/login/login_service")
    protected LoginService mLoginService;

    private static LoginImpl mLoginImpl = null;

    public static LoginImpl getInstance() {
        if (mLoginImpl == null) {
            synchronized (LoginImpl.class) {
                if (mLoginImpl == null) {
                    mLoginImpl = new LoginImpl();
                }
                return mLoginImpl;
            }
        }
        return mLoginImpl;
    }

    private LoginImpl() {
        // 初始化LoginService
        ARouter.getInstance().inject(this);
    }

    public User getUserInfo() {
       return mLoginService.getUserInfo();
    }

    public void removeUser() {
        mLoginService.removeUser();
    }

    public boolean hasLogin() {
        return mLoginService.hasLogin();
    }

    public void login(Context context) {
        mLoginService.login(context);
    }


}

mo_voice/src/main/java/com/moluo/mo_voice/view/home/HomeActivity.java

package com.moluo.mo_voice.view.home;

import com.moluo.lib_base.ft_login.service.impl.LoginImpl;
...

/**
 * 首页Activity
 */
public class HomeActivity extends BaseActivity implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.unloggin_layout:
                if (!LoginImpl.getInstance().hasLogin()) {
                    LoginImpl.getInstance().login(this);
                } else {
                    mDrawerLayout.closeDrawer(Gravity.LEFT);
                }
                break;
                ...
        }
    }

    ...

    /**
     * 处理登陆事件
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onLoginEvent(LoginEvent event) {
        ...
        ImageLoaderManager.getInstance().displayImageForCircle(mPhotoView,
                LoginImpl.getInstance().getUserInfo().data.photoUrl);
    }
}

Last updated

Was this helpful?