基于Arouter的登录拦截

ARouter 爬坑之旅



# 效果图



## 1、ARouter功能介绍

1. 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中

2. 支持多模块工程使用

3. 支持添加多个拦截器,自定义拦截顺序

4. 支持依赖注入,可单独作为依赖注入框架使用

5. 支持InstantRun

6. 支持MultiDex(Google方案)

7. 映射关系按组分类、多级管理,按需初始化

8. 支持用户指定全局降级与局部降级策略

9. 页面、拦截器、服务等组件均自动注册到框架

10. 支持多种方式配置转场动画

11. 支持获取Fragment

12. 完全支持Kotlin以及混编()

13. 支持第三方 App 加固(使用 arouter-register 实现自动注册)

14. 支持生成路由文档



 2、用法

2.1 添加依赖和配置

```gradle

android {

defaultConfig {

...

javaCompileOptions {

annotationProcessorOptions {

arguments = [AROUTER_MODULE_NAME: project.getName()]

}

}

}

}

dependencies {

implementation 'com.alibaba:arouter-api:1.4.0'

annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'

...

}

```

2.2 初始化sdk

```java

初始化阿里巴巴路由框架

if (ConfigConstants.IS_DEBUG) {          // 这两行必须写在init之前,否则这些配置在init过程中将无效

ARouter.openLog();    // 打印日志

ARouter.openDebug();  // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)

}

ARouter.init(this)// 尽可能早,推荐在Application中初始化

```

2.3 添加注解

```java

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 添加自动属性注入 这句话可以放在baseActivity中

ARouter.getInstance().inject(this);

}

```

```java

// 对应的Activity 添加@Route注解 path路径 这里的路径需要注意的是至少需要有两级,/xx/xx

@Route(path = ConfigConstants.FIRST_PATH)

public class FirstActivity extends BaseActivity {

private TextView tvMsg;

@Autowired

public String msg;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_first);

tvMsg = findViewById(R.id.tv_msg);

tvMsg.setText(msg);

}

}

```

 2.4 拦截器的使用面向切面编程

```java

// 比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查

// 拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行

@Interceptor(name = "login", priority = 6)

public class LoginInterceptorImpl implements IInterceptor {

@Override

public void process(Postcard postcard, InterceptorCallback callback) {

String path = postcard.getPath();

LogUtils.d(path);

boolean isLogin = SPUtils.getInstance().getBoolean(ConfigConstants.SP_IS_LOGIN, false);

if (isLogin) { // 如果已经登录不拦截

callback.onContinue(postcard);

} else {  // 如果没有登录

switch (path) {

// 不需要登录的直接进入这个页面

case ConfigConstants.LOGIN_PATH:

case ConfigConstants.FIRST_PATH:

callback.onContinue(postcard);

break;

default:

callback.onInterrupt(null);

// 需要登录的直接拦截下来

break;

}

}

}

@Override

public void init(Context context) {

LogUtils.v("路由登录拦截器初始化成功"); //只会走一次

}

}

// activity启动的时候

ARouter.getInstance().build(ConfigConstants.SECOND_PATH)

.withString("msg", "ARouter传递过来的需要登录的参数msg")

.navigation(this,new LoginNavigationCallbackImpl()); // 第二个参数是路由跳转的回调

// 拦截的回调

public class LoginNavigationCallbackImpl  implements NavigationCallback{

@Override //找到了

public void onFound(Postcard postcard) {

}

@Override //找不到了

public void onLost(Postcard postcard) {

}

@Override    //跳转成功了

public void onArrival(Postcard postcard) {

}

@Override

public void onInterrupt(Postcard postcard) {

String path = postcard.getPath();

LogUtils.v(path);

Bundle bundle = postcard.getExtras();

// 被登录拦截了下来了

// 需要调转到登录页面,把参数跟被登录拦截下来的路径传递给登录页面,登录成功后再进行跳转被拦截的页面

ARouter.getInstance().build(ConfigConstants.LOGIN_PATH)

.with(bundle)

.withString(ConfigConstants.PATH, path)

.navigation();

}

}

```

 5、遇到的问题

1. 页面之间跳转使用阿里巴巴ARouter跳转,其中注意带返回值启动的时候请求吗不能为0否则没有回调onActivityResult

2. 使用ARouter传递参数的时候如果有传递Bundle跟其他的属性Bundle必须写在前面否则其他的属性注入不了

6、项目地址


https://github.com/xingfu0809/ArouterLogin

你可能感兴趣的:(基于Arouter的登录拦截)