Ablepsia 和 startActivity() 说再见

Ablepsia 是一个可以简化 startActivity() 简化参数传递、view元素过渡分享动画、拦截、重定向、多重重定向、保证跳转存活的轻量级框架

Ablepsia – git 项目地址点这里

曾经你在代码里写了无数遍判断之后的各种混乱跳转、曾经写过无数次的跳转工具类,现在终于来帮你提供解决方案了

《Ablepsia 和 startActivity() 说再见》

曾经有一个用户详情页需要在已登录的前提下才能打开,于是我写了一个跳转工具类,增加了一个打开用户详情页方法,判断没登陆就打开登录页面,···嗯嗯我日,登录后怎么继续打开用户详情页,回调?好吧,那就回调吧。后来又来了一个好友列表也要已登录才能打开,于是我又增加一个方法,后来又来了50+个也要已登录才能打开,于是又增加了50+个方法,增加了50+个回调

我问了自己无数次 《Ablepsia 和 startActivity() 说再见》

对于上述栗子,Ablepsia 的处理姿势十分优雅,将 50+ 变为 1 次判断,自动重定向到登录页面,登录成功后自动跳转到用户详情页面,没有一个回调。整个过程无需开发者干预。你若还有别的跳转条件,比如什么打开某个页面之前需要检查wifi状态啊,检查用户身份啊等等,那都不算事了。

屁话说多了啊,看看效果吧

《Ablepsia 和 startActivity() 说再见》

Demo 在 git 上 https://github.com/Xiao187/Ab…

如上糟糕的GIF所示 ,第一次未登录状态下打开 用户详情页,将会被重定向到 登录页,点击登录成功后继续跳转到用户详细页,第二次已登录状态打开 用户详情页,直接跳转到 用户详情页,并将 view 过渡分享过去。由于第一次跳转被重定向,所以 view 分享的动画被强制丢失了,原因是考虑到重定向之后的元素分享会错乱

OK,接下来介绍使用姿势

  • 配置 gradle

    //项目的 build.gradle 添加如下
    allprojects {
        repositories {
            ...
            maven { url "https://jitpack.io" }
        }
    }
    // 模块的 build.gradle 添加如下
    dependencies {
            compile 'com.github.Xiao187:Ablepsia:v1.0.7'
    }
  • 使用

        //打开 UseInfoActivity
        Ablepsia.open(this, UseInfoActivity.class);
        //打开 UseInfoActivity 带参数,支持所有类型
        Ablepsia.kv("name","jack").open(this, UseInfoActivity.class);
        //打开 UseInfoActivity 指定 flag
        Ablepsia.flag(Intent.FLAG_ACTIVITY_NEW_TASK)
                    .open(this, UseInfoActivity.class);
        //打开 UseInfoActivity 分享元素
        Ablepsia.options(ActivityOptionsCompat.makeSceneTransitionAnimation(this, view, "name").toBundle())
                    .open(this, UseInfoActivity.class);
  • 拦截 – 重定向

//在需要拦截或重定向的 Activity 上 使用 @Symptom 注解
@Symptom("需要登录才能打开")
public class UseInfoActivity extends AppCompatActivity {}
//自定义 Doctor 继承 Doctor
public class DemoDoctor extends Doctor {

    @Override
    protected Anagraph treatment(String symptom, Context context, Class blind) {}
    
    @Override
    protected void funeral(String symptom, Context context, Class<? extends Activity> activity) {
        //调用 Anagraph.die() 后,会回调到这里
        //默认空实现
    }
}
    // Ablepsia.open() 之前设置 Doctor,否则不会拦截
    Ablepsia.setDoctor(new DemoDoctor());
    //在 treatment 方法中实现拦截,不能 return null;
    @Override
    protected Anagraph treatment(String symptom, Context context, Class blind) {
        switch (symptom) {
                case "需要登录才能打开":
                    if (SignInStatus.isSign()){
                        return Anagraph.alive();// -- 继续执行
                    }else {
                        Ablepsia.open(context,SignInActivity.class); //打开登录页面

                        /**
                         * 拘留,直到调用 DemoDoctor.alive("先去登录") 才会继续跳转
                         * 你可以在登录成功之后调用 DemoDoctor.alive("先去登录"),将会跳转至UseInfoActivity
                         */
                        return Anagraph.detained("先去登录");
                    }
                default:
                    return Anagraph.die();// -- 终止跳转
        }
}

上述 Anagraph.detained("key"); 是指将这一次跳转拘留起来,你可以在某一时刻调用 DemoDoctor.alive("key"); 就会继续执行这一次未完成的跳转,比如,你可以在 登录成功的回调 里并且在 登录页面 finish(); 之前调用 。推荐在 finish(); 之前调用的原因是画面可以更流畅,不信的话你可以试试在 finish(); 之后调用

除了上述 Anagraph.alive();Anagraph.detained("key");Anagraph.die(); 三种方式,还有一种不推荐的处理方式,使用 Chaperonage 监视:

    //默认每 500 毫秒监视一次,你可以让他更快
    //当监视到 return true; 便继续这一次未完成的跳转
    return Anagraph.detained(new Anagraph.Chaperonage(/* 500 */) {
        @Override
        public boolean Chaperonage() {
               return SignInStatus.isSign();
        }
    });

Chaperonage 原理是开启了一个子线程来监视,当条件成立时便继续执行任务,不推荐在Chaperonage() 方法中做复杂的任务,由于这种方式可能产生不必要的资源浪费,所以不推荐使用,建议用Anagraph.detained("key"); 来替换。

注意事项

  • 如过不调用 Ablepsia.setDoctor();, 将会使用默认 Doctor,默认 Anagraph.alive();

  • 如果不是 return Anagraph.alive();,将会清空此次跳转携带的 options(),也就是说被重定向过的跳转将会失去 options(),原因是考虑到重定向之后的元素分享会错乱;

·
·
·

    原文作者:杨潇
    原文地址: https://segmentfault.com/a/1190000007201027
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞