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?