Ablepsia 是一个可以简化 startActivity() 简化参数传递、view元素过渡分享动画、拦截、重定向、多重重定向、保证跳转存活的轻量级框架
曾经你在代码里写了无数遍判断之后的各种混乱跳转、曾经写过无数次的跳转工具类,现在终于来帮你提供解决方案了
曾经有一个用户详情页需要在已登录的前提下才能打开,于是我写了一个跳转工具类,增加了一个打开用户详情页方法,判断没登陆就打开登录页面,···嗯嗯我日,登录后怎么继续打开用户详情页,回调?好吧,那就回调吧。后来又来了一个好友列表也要已登录才能打开,于是我又增加一个方法,后来又来了50+个也要已登录才能打开,于是又增加了50+个方法,增加了50+个回调
我问了自己无数次
对于上述栗子,Ablepsia 的处理姿势十分优雅,将 50+ 变为 1 次判断,自动重定向到登录页面,登录成功后自动跳转到用户详情页面,没有一个回调。整个过程无需开发者干预。你若还有别的跳转条件,比如什么打开某个页面之前需要检查wifi状态啊,检查用户身份啊等等,那都不算事了。
屁话说多了啊,看看效果吧
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(),原因是考虑到重定向之后的元素分享会错乱;
·
·
·
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。