该用路由来管理你的界面跳转了

2023-11-05 23:10

本文主要是介绍该用路由来管理你的界面跳转了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

code小生,一个专注 Android 领域的技术平台

公众号回复 Android 加入我的安卓技术群

作者:倔强码农
链接:https://www.jianshu.com/p/95f8dab88b04
声明:本文已获倔强码农授权发表,转发等请联系原作者授权

一般情况来说,我们做界面跳转直接调用starActivity方法即可;当然你不考虑后续维护,程序不会多变,你可以一直这么用下去,没什么大碍;但是我们程序一般维护到底,直到下线为止;那么就该尽量的对程序做维护做优化了,比如对界面的跳转做优化;
路由的概念并不陌生,用它主要有以下一些好处

1,对activity的跳转做统一的管理
2,对跳转的结果,过程,可控
3,遍历来至于外部的跳转
4,便于维护
5,组件化必备
.....

直接看用法,这里使用阿里巴巴的Aroute

一,引入框架

compile 'com.alibaba:arouter-api:1.4.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'


 defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

二,配置路由路径

path为跳转的路由路径,extras 为拦截策略

@Route(path = "/app/order", extras = ArouteConfig.STRATEGY1)
public class OrderActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);
    }

}

三,跳转界面

ARouter.getInstance().build("/app/order").navigation()

这种跳法呢最主要的是解决组件化跳转的问题,因为多模块是找不到类名的;
道然如果不是组件化的程序,也是值得我们一用的.

举个栗子:
平时我们跳转界面可能会写下面的代码,先检测是否登录,才能跳转,如果只是一小段这样的逻辑,随便怎们写都无所谓;但是如果有很多重复的逻辑,比如有很多地方可以调到订单界面,那就要写很多这样的代码,有一天逻辑变了或者说不仅要判断登录,还要判断用户有没有绑定手机号,想想就很恶心啊;

boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin"false);
                if (isLogin) {
                    callback.onContinue(postcard);
                } else {
                    callback.onInterrupt(new Exception("请先登录"));
                }

那么就可以用到拦截器来解决这个问题,优雅而大方的做到全局的控制

1,为了万一哪天要组件化,我们最好把路由的跳转拿出来放到基础包里,哪天组件化了也好进行抽离,不要封装到Activty里面;

键入我们先简单的封装俩个统一的跳转方法,一个带参数,一个不带参数,callBack封装一个自己的来处理自己的逻辑

/**
     * 不带参数跳转
     * @param context
     * @param path
     */

    public static void toActivity(final Context context, String path) {
        ARouter.getInstance().build(path).navigation(context, new MyNavigationCallback(context));
    }

    /**
     * 带参数跳转
     * @param context
     * @param path
     * @param bundle
     */

    public static void toActivity(final Context context, String path, Bundle bundle) {
        ARouter.getInstance().build(path)
                .withBundle("data", bundle).navigation(context, new MyNavigationCallback(context));
    }

NavigationCallback

public class MyNavigationCallback implements NavigationCallback {

    private Context context;

    public MyNavigationCallback(Context context) {
        this.context = context;
    }

    @Override
    public void onFound(Postcard postcard) {

    }

    @Override
    public void onLost(Postcard postcard) {

    }

    @Override
    public void onArrival(Postcard postcard) {

    }

    @Override
    public void onInterrupt(final Postcard postcard) {
        //假设值处理onInterrupt方法,这里只把为什么被拦截的信息打出来
        new Handler(context.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, (String) postcard.getTag(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

二,然后的定义一组拦截的策略,因为它这里定义的拦截器是全局的,如果你不定义策略做处理,进本所有的界面都会被拦截

假设我们只定义一个策略

public interface ArouteConfig {
    int STRATEGY1 = 1;//拦截登录
}

三,那么就可以开始写一个拦截器了
在拦截器中我们对所有的策略做一个处理,根据每个策略的具体做法,比如策略1我们只拦截登录,那么就要在登录里判断,如果是策略1就去做处理;比如在策略2中我们拦截登录和绑定手机号,那么在登录中判断如果是策略2也要做处理,在手机号拦截中也要判断,整个拦截器的机制其实和okhttp的机制很像,是根据拦截的级别去链式调用的

@Interceptor(priority = 1, name = "loginInterceptor")
public class OrderInterceptor implements IInterceptor {

    private Context context;

    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        int extra = postcard.getExtra();
        switch (extra) {
            //拦截登录
            case ArouteConfig.STRATEGY1:
                boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin"false);
                if (isLogin) {
                    callback.onContinue(postcard);
                } else {
                    callback.onInterrupt(new Exception("请先登录"));
                }
                break;
            //什么都不拦截
            default:
                callback.onContinue(postcard);
                break;
        }

    }

    @Override
    public void init(Context context) {
        this.context = context;
    }
}

上面便是登录的拦截器,看到在策略1中去做判断,其他的神们都不管.

四,配置Activity的拦截策略
如果不需要进行拦截extras 就不需要配置了

@Route(path = "/app/order", extras = ArouteConfig.STRATEGY1)
public class OrderActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);
    }

}

以上就是路由的有个大体用法,当然还有很多方便的东西,比如全局的降级,外部scheme的处理等等…总之该彻底抛弃系统的跳转方法了;

路由相关推荐

自己动手做 android 路由框架

Android 多模块多组件开发 - 打造属于自己的路由

640

分享技术我是认真的

这篇关于该用路由来管理你的界面跳转了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353063

相关文章

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包