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

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

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖