当前位置: 首页 > news >正文

Android路由框架AnnoRouter:使用Java接口来定义路由跳转

介绍

AnnoRouter是一个用于协助Android组件化的路由框架。它参考了Retrofit的接口设计,将路由跳转API转化为Java接口,使用注解来配置跳转信息。

AnnoRouter示例

Usage

初始化全局Router

Router.Builder builder = new Router.Builder()
        .application(this)
        ...
       
Router.init(builder);

拦截过滤url

new Router.Builder()
    .routerUrlFilter(new IRouterUrlFilter() {
        @Override
        public String filter(String url) {
            ...
            return url;
        }
    })
    ...

异常错误处理

new Router.Builder()
    .exceptionHandler(new IExceptionHandler() {
        @Override
        public void handler(String url, Exception e) {
            
        }
    })
    ...

定义路由Api

使用 @RouterScheme, @RouterHost, @Path@Param 来定义一个路由地址。

@RouterScheme("scheme")
@RouterHost("host")
public interface RouterApi {
     
    @Path("path")
    ...
    void jump(@Param("paramName") int paramValue);
        
}
 
public interface RouterApi {
     
    @RouterScheme("scheme")
    @RouterHost("host")
    @Path("path")
    ...
    void jump(@Param("paramName") int paramValue);
        
}

有时候,存在 scheme://host/path相同但参数不一样的路由地址,就需要使用注解 @Strict 来作区别。

e.g.


@RouterScheme("scheme")
@RouterHost("host")
public interface RouterApi {
     
    @Path("path")
    ...
    void jumpToActivity1(@Param("param1") String param1);
    
    
    @Strict
    @Path("path")
    ...
    void jumpToActivity2(@Param("param1") String param1, @Param("param2") int param2);
        
}
  • scheme://host/path?param1=a 将会匹配上方法 jumpToActivity1
  • scheme://host/path?param1=a&param2=1 将会匹配上方法 jumpToActivity2
  • scheme://host/path?param1=a&param2=1&param3=1 将会匹配上方法 jumpToActivity1, 但 param2=1&param3=1 会被忽略掉。

处理前置校验或准备任务

public interface RouterApi {
     
    @Task(CustomRouterTask.class)
    ...
    void jumpToActivity();
        
}
 
// ----------------
     
public class CustomRouterTask implements IRouterTask {
                                     
    @Override
    public void execute(Context context, RouterInfo routerInfo, OnTaskResult onTaskResult) {
        // do something...
        onTaskResult.success();
    }

}

跳转到Activity或自定义处理

public interface RouterApi {
     
    ...
    @Activity(LoginActivity.class)
    void jumpToLogin();
    
    ...
    @RouterHandler(CustomRouterHandler.class)
    void jumpToLogin();
        
}
 
// ----------------
 
public class CustomRouterHandler implements IRouterHandler {

    @Override
    public void applyRouter(Context context, RouterInfo routerInfo, OnRouterResult routerResult) {
        
        // do what you want to do.
 
        if(routerResult != null) {
            routerResult.onSuccess();
        }
    }
}

自定义Activity转场动画


public interface RouterApi {
     
    ...
    @Transition(CustomeTransition.class)
    void jumpToLogin();
        
}
 
// ----------------
 
public class CustomeTransition implements IActivityTransition {
                     
    @Override
    public int enterAnim() {
        return R.anim.fade_in;
    }
 
    @Override
    public int exitAnim() {
        return R.anim.fade_out;
    }
}

设置Activity launchMode


public interface RouterApi {
     
    ...
    @Flags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    void jump(@Flags int flags);
    
    
    ...
    void jump(@Flags int flags);
        
}
 
// ----------------
 
Router.create(RouterApi.class).jump(Intent.FLAG_ACTIVITY_CLEAR_TOP);

添加路由Api

需要将定义好的路由Api添加至Router。如果只通过接口而不通过url跳转,可以不添加。

Router.addRouterIndex(RouterApi.class);

自定义协议处理

主要处理一些特殊url协议,比如 http, https

public class HttpSchemeHandler implements ISchemeHandler {
 
    @Override
    public void applyRouter(Context context, String url, OnRouterResult routerResult) {
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        Uri content_url = Uri.parse(url);
        intent.setData(content_url);
        context.startActivity(intent);
 
        if(routerResult != null) {
            routerResult.onSuccess();
        }
    }
}

// ----------------
 
HttpSchemeHandler httpSchemeHandler = new HttpSchemeHandler();
Router.addSchemeHandler("https", httpSchemeHandler);
Router.addSchemeHandler("http", httpSchemeHandler);

使用路由Api进行跳转

两种跳转调用方式:接口跳转,url跳转。


// The Router class generates an implementation of the RouterApi interface.
RouterApi routerApi = Router.create(RouterApi .class);
routerApi.jump("value");
 
// or use url instead.
Router.execute("scheme://host/path?param=value");
     

获取Activity Result

@RouterScheme("app")
@RouterHost("usercenter")
public interface LoginRouterApi {
     
    @Path("login")
    @Activity(LoginActivity.class)
    @RequestCode(1001)
    void jumpToLogin(@Param("mobile") String mobile);
        
    @Activity(LoginActivity.class)
    @RequestCode(1001)
    void jumpToLogin(@Param("mobile") String mobile, OnActivityResult onActivityResult);
}
 
// ----------------
 
OnActivityResult onActivityResult = new OnActivityResult() {
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
         
    }
    
    @Override
    public void onSuccess() {
        
    }
 
    @Override
    public void onFailure(Exception e) {

    }
};
 
Router.execute("app://usercenter/login?mobile=0123456789", onActivityResult);
// or
Router.create(LoginRouterApi.class).jumpToLogin("0123456789", onActivityResult);

Get it

AnnoAdapter is now available on JCentral.

implementation 'com.eastwood.common:anno-router:1.0.2'

结语

AnnoRouter已上传Github,欢迎Star交流
https://github.com/EastWoodYang/AnnoRouter

相关文章:

  • Android系统文件目录
  • 你应该知道H5的iPhoneX适配
  • vue刷新当前页面,11选5平台维护
  • final关键字,static关键字
  • js数组条件筛选——map()
  • was安装相关步骤(Linux)
  • Lambda表达式与函数式接口
  • Vuex持久化插件-解决刷新数据消失的问题
  • 关于性能测试的这点事,值得收藏~
  • 深入理解Spring Boot数据源与连接池原理
  • [python]PyPI使用国内源
  • scp
  • Spring AOP总结
  • Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'
  • 迷宫问题的求解(回溯法、深度优先遍历、广度优先遍历)
  • 0基础学习移动端适配
  • Brief introduction of how to 'Call, Apply and Bind'
  • Centos6.8 使用rpm安装mysql5.7
  • Docker 笔记(2):Dockerfile
  • Gradle 5.0 正式版发布
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Java超时控制的实现
  • Mybatis初体验
  • mysql常用命令汇总
  • oldjun 检测网站的经验
  • python_bomb----数据类型总结
  • ReactNative开发常用的三方模块
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用putty远程连接linux
  • 数据库巡检项
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • $(selector).each()和$.each()的区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (九十四)函数和二维数组
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (全注解开发)学习Spring-MVC的第三天
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .NET 5种线程安全集合
  • .net和jar包windows服务部署
  • .NET业务框架的构建
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [android] 看博客学习hashCode()和equals()
  • [Android]How to use FFmpeg to decode Android f...
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [Java] 图说 注解
  • [Java开发之路](14)反射机制
  • [JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制
  • [LeetCode]—Permutations II 求全排列(有重复值)