Android 小型路由 SimpleRouter

闲来无事,利用 APT 写了个类似 ARouter 的小型路由框架,方便组件化跳转。

功能说明

基本路由跳转

路由跳转当然是 SimpleRouter 最基本的功能。

1、使用 SimpleRouter 注解标注路由名。

@SimpleRouter(value = "main_page", interceptor = "")
public class MainActivity extends AppCompatActivity {
    ...
}

@SimpleRouter(value = "home_page", interceptor = "")
public class HomeActivity extends AppCompatActivity {
    ...
}

2、使用 SRouter 类进行跳转。

@SimpleRouter(value = "main_page", interceptor = "")
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 示例路由跳转
        SRouter.build(this, "home_page").execute();
    }
}

综上就完成了 Activity 之间的跳转。

带参路由跳转

1、传递参数

SRouter.build(this, "home_page")
        .addParams("title", "This is title")
        .addParams("book", new Book("书名", 99.9))
        .execute();

2、解析参数

@SimpleRouter(value = "home_page", interceptor = "")
public class HomeActivity extends AppCompatActivity {

    @SimpleParam("title")
    String mTitle;

    @SimpleParam("book")
    Book mBook;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        SRouter.initParams(this);
    }
}

调用 @SimpleParam 注解指定要解析的参数, 调用 SRouter.initParams(this) 以解析参数。

该代码可以写在基类中,即使没有参数可解析也没影响。

路由监控和拦截

SimpleRouter 包含了简单的路由监控和拦截机制。

监控

SRouter.build(this, "home_page")
       .callback(new RouterCallback() {
            @Override
            public void onFound() {}

            @Override
            public void onLost() {}

            @Override
            public void onArrival() {}

            @Override
            public void onIntercept(Interceptor interceptor) {}
       })
       .execute();

它们触发的时机分别是:

onFound:找到路由,跳转前。
onLost:未找到路由。
onArrival:找到路由,跳转后。
onIntercept:找到路由,跳转被拦截后。

拦截

拦截支持俩种方式,分别是通用拦截器和临时拦截器。

通用拦截器

先说通用拦截器,这种拦截方式会在跳转到目标 Activity 之前,先执行其拦截器。因为任何 Activity 跳转至目标 Activity 都会先触发该拦截器,所以称为通用拦截器。

首先定义拦截器

...
import com.dixon.simple.router.guide.Interceptor;

public class HomeInterceptor implements Interceptor {
    @Override
    public boolean onIntercept(Context context) {
        // 示例代码 未登录则跳转登录页
        if (Constant.isLogin()) {
            return false;
        }
        SRouter.build(context, "login_page").execute();
        // true 表示拦截
        return true;
    }
}

然后给目标 Activity 关联该拦截器,interceptor 值为上述拦截器的全限定名。

@SimpleRouter(value = "home_page", interceptor = "com.dixon.comp.home.HomeInterceptor")
public class HomeActivity extends AppCompatActivity {
    ...
}

这样任意 Activity 跳转至 HomeActivity 前,都会触发 HomeInterceptor 的逻辑。

interceptor 可以为空字符串,找不到拦截器不会影响正常跳转。

临时拦截器

故名思义,只在本次跳转生效。使用方式如下:

SRouter.build(this, "home_page")
       .interceptor(new Interceptor() {
            @Override
            public boolean onIntercept(Context context) {
                // false 表示不拦截 your logic
                return false;
            }
       })
       .execute();

优先级上,临时拦截器 > 通用拦截器。

项目配置

要使用 SimpleRouter,需要如下配置:

1、在需要使用到 SimpleRoutermodulebuild.gradle 文件中,如下配置:

android {
    ...
    defaultConfig {
        ...
        // 配置 moduleName 用于生成特殊文件
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }
    }
}

dependencies {
    ...
    implementation 'com.dixon.srouter:simple_router:1.0.1'
    annotationProcessor 'com.dixon.srouter:simple_router_processor:1.0.1'
}

2、在你的 Application 中完成初始化。

public class XXApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        SRouter.init(this);
    }
}

如上,配置完毕。

源码地址

源码及Demo Github

备注说明

很简单的小项目,没有复杂的功能,没有 ARouter 强大,小型项目可用,简单易上手。

如果有功能需要或提 bug,可以 Github 或者直接下边提需求,后续会逐步更新优化。

你可能感兴趣的:(Android 小型路由 SimpleRouter)