确认过眼神,这就是你要的路由库

上一篇文章我们谈到了如何实现一个路由库,那本篇文章就给大家推荐一个好用的路由库,来确认下眼神,这就是你要的路由库。

EasyRouter:一个简单、稳定、强大、高性能的组件化路由框架。github地址:https://github.com/liuzhao2007/EasyRouter。

欢迎使用、star、fork、pr。

一、功能特性

  1. 通过url打开Activity,实现界面间解耦;
  2. 通过服务实现方法调用,实现Module间方法调用解耦;
  3. 通过拦截器实现界面跳转的处理:条件拦截、埋点统计等;
  4. 界面、服务、拦截器均支持多Module;
  5. 基于编译时注解,界面、服务、拦截器等均可自动注册;
  6. 可传递Bundle支持的所有数据类型;
  7. 支持自动注入参数到目标界面;
  8. 支持获取Fragment;
  9. 支持全局、局部过程监听:降级、打开后等;
  10. Api简单、实现高性能;

二、应用场景

  1. Module内、跨Module界面跳转,界面解耦;
  2. 界面跳转过程拦截:条件拦截(eg:未登录)、重定向等;
  3. 跨Module方法调用,Module间解耦;
  4. 外部Url跳转应用内界面;

三、集成使用

1. 添加依赖与配置

    android {
        defaultConfig {
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [ moduleName : project.getName() ]
                }
            }
        }
    }
    dependencies {
        compile 'com.easyrouter:router-api:1.2.3'
        compile 'com.easyrouter:router-annotation:1.2.3'
        annotationProcessor 'com.easyrouter:router-compiler:1.2.3'
    }

在Project级别的build.gradle中添加:

    allprojects {
        repositories {
            jcenter()
            maven { url "https://dl.bintray.com/liuzhaowy2007/maven" }
        }
    }

2、初始化

EasyRouterConfig.getInstance().setScheme()必调,别的设置选调;

    EasyRouterConfig.getInstance()
            .setDebug(true)
            .setScheme("easyrouter")
            .setDefaultRouterCallBack(new IRouterCallBack() {
                @Override
                public void onFound() {
                    LogUtil.i("default onFound");
                }
                @Override
                public void onLost() {
                    LogUtil.i("default onLost");
                }
                @Override
                public void onOpenSuccess() {
                    LogUtil.i("default onOpenSuccess");
                }
                @Override
                public void onOpenFailed() {
                    LogUtil.i("default onOpenFailed");
                }
            })
            .init(EasyRouterApp.this);

3、添加注解

  1. 在app里任意一个类中添加注解@DispatcherModules,里面写上所有使用此框架的Module的name;
    例如:@DispatcherModules({"app","moduleinteract"});
  1. 在任意需要路由打开的Activity加上注解@DisPatcher,里面写上其对应的url;
    @DisPatcher({"easyrouter://main", "easyrouter://maintwo"})
    public class MainActivity extends Activity

4、发起路由

    1. EasyRouter.open("easyrouter://main");//方式一
    2. EasyRouter.with("easyrouter://main").open();//方式二

四、进阶使用

1、传递参数

  • 不通过url传参;
    EasyRouter.with("easyrouter://main").withString("stringparams","")// 传递基本数据类型;
                        .withParcelable("parcelable",null)// 传递系列化对象;
                        .withFlags(Intent.FLAG_ACTIVITY_NEW_TASK)// 设置Flag;
                        .withTransition(0,0)// 设置动画;
                        .open(Activity,requestCode);// 设置RequestCode
  • 通过url传参:非必须参数;
    EasyRouter.open("easyrouter://main?name=liuzhao&sex=man");
    这样传递了两个参数:name与sex;在目标Activity中可以通过getIntent.getString("name")方式来获取;
  • 通过url传参:必须参数;
    注解声明:
    @DisPatcher({"easyrouter://main/i:tab"}) // 注解声明需要一个必备参数tab,并且声明其类型为int;
    public class MainActivity extends Activity 
    调用:
    EasyRouter.open("easyrouter://main/3");
    这样传递了一个参数:tab;在目标Activity中可以通过getIntent.getInt("tab",0)方式来获取;

备注:必须参数与非必须参数可搭配使用,区别在于必须参数参与url匹配过程;通过url传参与不通过url传参两种方式可搭配使用。

2、Module间通信(方法调用)

配置稍微复杂,但使用极其简单;可参考modulelib中的BaseModuleService。

  1. 在项目的Library中创建继承IBaseModuleService的接口文件com.android.easyrouter.service.BaseModuleService;(包名、类名及继承关系不可变)
  2. 各Module需要向外提供的方法在BaseModuleService中新建接口类并暴露接口;
  public interface ModuleInteractService extends BaseModuleService {
      void runModuleInteract(Context context);
  }
  1. 在Module中创建Module的接口实现类,类名需要和接口名一样;
  2. 打上注解@ModuleService、并编译;
  3. 在别的Module中直接以方法调用;
  EasyRouter.getModuleService(BaseModuleService.ModuleInteractService.class).runModuleInteract(context);

备注:配置复杂带来的优势是方法的直接调用,无需强转也不限定调用方法的方法签名;

3、拦截器

  1. 实现IInterceptor接口;
  2. 打上注解@Interceptor;
    @Interceptor
    public class RouterTestInterceptor implements IInterceptor{
        @Override
        public boolean intercept() {
            LogUtil.i("intercept by me");
            return true;// if true intercept; false go on;
        }
        @Override
        public void onIntercepted() {
        }
    }

备注:在intercept方法中进行拦截与否的判断,例如登录态、重定向等;

4、过程监听

  EasyRouter.open("easyrouter://routertest",new IRouterCallBack(){
        @Override
        public void onFound() {
            //匹配到
        }
        @Override
        public void onLost() {
            //匹配不到,可做降级;
        }
        @Override
        public void onOpenSuccess() {
            //界面打开成功
        }
        @Override
        public void onOpenFailed() {
            //界面打开失败,可做降级;
        }
    });

备注:可以对每一次路由做监听,也可以设置全局默认的监听;

    EasyRouter.init(EasyRouterApp.this).setScheme("easyrouter").setDefaultRouterCallBack();

5、获取Fragment;

    // 传入Fragment继承的类,android.app.Fragment或者android.support.v4.app.Fragment
    Fragment fragment = EasyRouter.with("easyrouter://fragmenttest").getFragment(Fragment.class);

6、外部Url跳转应用内界面;

AndroidManifest.xml中注册

    <activity
        android:name="com.android.easyrouter.url.EasyRouterUrlActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="easyrouter" /><!--改成自己的Scheme-->
        </intent-filter>
    </activity>

备注:也可以使用自己的Activity:

  • 只需要调用EasyRouter.open(Uri.toString());即可

7、自动注入参数到界面;

  • 在目标Activity中加上EasyRouter.inject(this);
  • 在Activity中需要自动传参的参数上加上注解@AutoAssign,则会自动通过Intent赋值。例如:
    @AutoAssign
    long time;
    @AutoAssign
    int age;
    @AutoAssign
    String url;

备注:自动注入参数功能目前仅支持基本数据类型和String;

原文发布于微信公众号 - 双十二技术哥(gh_b0e7544783e2)

原文发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

SSIS数据流

数据流是在SQL Server 2005中才引入的新概念。数据流是专门处理数据操作的工作流。数据流也称为流水线。可以将数据流认为是装配线,该装配线包含了顺序执行...

2079
来自专栏技术小黑屋

Error-prone,Google出品的Java和Android Bug分析利器

Error-prone是基于BugPattern来发现问题的,覆盖范围不仅限于Java还包含Android代码。一些比较常见的BugPattern有如下这些

4432
来自专栏everhad

App开发:模拟服务器数据接口 - MockApi

为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块。本篇文章就尝试为使用gra...

5628
来自专栏影子

开始食用grpc(之一)

转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9501353.html

3002
来自专栏开发之途

Retrofit2与服务端实例讲解

1455
来自专栏钟绍威的专栏

struts的声明式异常处理 demo

情景 使用Struts封装的下载文件的功能 当下载文件找不到的时候,struts获取的InputStream为null 这个时候,就会报500错误 ja...

18510
来自专栏刘望舒

Retrofit2与服务端实例讲解

网络上对 Retrofit2 的各种介绍文章已经很多了,不过往往只是对其用法进行介绍,而缺少相应的实践,这一方面是因为网络上的免费API接口返回的数据格式和访问...

1253
来自专栏潇涧技术专栏

Art of Android Development Reading Notes 13

《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

992
来自专栏用户3030674的专栏

Android性能优化——之防止内存泄露

又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。

1071
来自专栏Google Dart

Flutter 构建完整应用手册-持久化

如果我们有一小部分我们想要保存的键值,我们可以使用shared_preferences插件。

2102

扫码关注云+社区

领取腾讯云代金券