需求定义
所以这里有两个需求: 1、自动跳转到登录界面 2、登录成功后再自动跳转到目标A界面
如果我们直接判断用户有没有登录,提醒用户登录。也没有让用户登录成功后再直接跳转到目标界面,这样的用户体验恐怕是不能满足一个高逼格程序员的要求。那么,我们来思考下,如何才能更加优雅的完成这个工作呢?
当然,在开始之前,我们可以先了解下其他人都是怎么做的,毕竟我们可以站在巨人的肩膀上才能看得更远。
思考可行的方案
首先我们第一个想到的解决方式,就是拦截器。如果我们在进入A界面的时候,可以在操作之前加入一个拦截器的话,岂不是可以做到在进入A界面前的判断呢?
在google之后,找到两个方案。
A、 Android拦截器 (可以点击查看)
此方案通过注解。在进入目标界面A时,判断是否有指定的拦截器,如果有,则检验是否满足拦截器要求,不满足,则执行拦截器的处理,处理完成后,通过onActivityResult最后触发invoke的回调方法。
此方案和我们需求略有不同,那么说下此方案存在的缺点: 1、用了继承的方式,来插入invoke的回调方法。由于java的单继承的特性,如果工程中已经有基类的情况,调整起来比较麻烦。侵入性太高。
2、此方案中,在没有登录的情况下,其实已经进入了目标A页面。相应的初始化都已经执行了。如果没有登录成功,这样工作其实是白做了。如果目标A界面要登录才能进入的话,此方案不符合要求的。
B、我们直接使用路由框架,参考下阿里的ARouter方案,可以看到,我们可以在固定路由上面插入拦截器。这里有一篇文章介绍 阿里ARouter拦截器使用及源码解析
看了文章后,发现拦截器实现的非常优雅,但是依然不是我们想要的。因为这个拦截器执行完后,马上会执行目标方法。中间并不会等待。所以我们根本没有办法去执行我们的登录操作。 所以pass了。
我们再回过头来思考,拦截器似乎并不能直接完成我们的需求,因为我们需要插入一个验证行为后(例如进入登录界面),还要执行相应的操作后,保证这个验证行为通过后,才能真正进入到我们的目标界面。
其实如果我们只是单纯的完成这个功能的话,可能大家最容易想到的就是,在进入登录界面的时候,在intent中装载一个目标target的intent.如果登录成功了,就判断是否有目标target,如果有,就跳转到目标target.
Intent intent = new Intent(this,LoginActivity.class);
Intent target = new Intent(this,OrderDetailActivity.class);
intent.putExtra(“target”,target);
startActivity(intent);
这种方式做起来非常直接,也可理解,但是最明显的问题就是,会导致登录界面多了很多与自己无关的业务判断。那我们继续google看看,有没有类似的做法,并且实现优雅一点的呢?
Android 登录判断器,登录成功后帮你准确跳转到目标activity 这篇的访问量比较大,似乎是个比较靠谱的方法。我们来大概分析下它的做法。
public static void intercep