Navigator参考了Dart的实现,把Dart简化并增加了跳转拦截器和scheme支持。主要功能有:
- scheme跳转并支持参数传递
- 跳转拦截器
@Navigation
用来注解需要跳转的Activity比如:
@Navigation(page = "second", subpage = ":userId")
public class SecondActivity extends AppCompatActivity {
...
}
其中page
字段制定跳转用的/page
页面,subpage
用来解析页面参数。
navigator-compiler
会在所有标记@Navigation
或者属性有标记@BundleExtra
类的package下生成一个*__BundleBuilder
类,比如上例就会生成SecondActivity__BundleBuilder
:
public final class SecondActivity__BundleBuilder extends BundleBuilder {
public static final String PAGE = "second";
public static final String PATTERN = Pattern.compile("second/(?<userId>[^/]+)");
}
@BundleExtra
用来注解类成员。例如:
public class SecondActivity extends AppCompatActivity {
@BundleExtra(autowired = true)
String userId;
...
}
navigator-plugin
会扫描依赖的库和当前module,生成一个(*__BundleBuilder.PAGE
, Constructor<? extends BundleBuilder>
)的map
跳转的时候可以通过如下方法传递userId
给SecondActivity
:
Navigator.parse("/second/10001") // `second`作为key,在map里找到对应的`BundleBuilder`
.startActivity(this);
// or
Navigator.parse("/second") // `second`作为key,在map里找到对应的`BundleBuilder`
.put("userId", "10001")
.startActivity(this);
SecondActivity
需要在Acitivity.onCreate
函数里用如下方法将Intent
的Extra信息绑定到Activity
:
// in SecondActivity.onCreate(...)
Navigator.bind(this);
// this.userId == "10001".
目前@BundleExtra支持的类型有:
char
byte
short
int
long
float
double
String
Parcelable
Serializable
String[]
Parcelable[]
List<String>
List<Parcelable>
List<Serializable>
@Navigation
的interceptors
成员可以指定跳转拦截器的Class
对象列表,如:
@Navigation(interceptors = LoginInterceptor.class)
public class SecondActivity extends AppCompatActivity {
...
}
这个列表的类必须实现Interceptor
接口,如下简单的登录拦截器实现:
public class LoginInterceptor implements Interceptor {
@Override
public boolean preIntercept(Context context) {
return false;
}
@Override
public boolean intercept(Intent intent) {
if (Math.random() > 0.5) {
return false;
}
Navigator.parse("/login")
.put("targetIntent", intent)
.startActivity(context);
return true;
}
}
@Navigation
的subpage
成员可以帮助url参数解析:
@Navigation(page = "second", subpage = ":userId")
public class SecondActivity extends AppCompatActivity {
@BundleExtra(autowired = true)
String userId;
}
当需要根据url解析参数时,只需要:
Navigator.parse("/second/10001")
.startActivity(context); // 这里自动获取userId参数为10001
跳转的时候可以带query参数,并且参数将通过Navigator.bind
绑定到对应的@BundleExtra
标记的成员,对应规则如下:
- 只对
@BundleExtra
标记为autowired
或者设置了key
的属性作处理; @BundleExtra
标记的成员默认参数名为成员名字,比如:String username
的参数明为"username"
,也可以通过@BundleExtra(key = "n")
指定参数名为"n"
;- 所有用
:
标记的路径变量和所有URL Query参数都会放到一个Map
里面,然后根据1里面对应的参数名,从这个列表获取参数;
Navigator compiler下载:
repositories {
maven {
jcenter()
}
}
dependencies {
implementation 'com.tutuur.android:navigator:0.9.14'
annotationProcessor 'com.tutuur.android:navigator-compiler:0.9.14'
}
Navigator plugin下载:
buildscript {
repositories {
maven {
jcenter()
}
}
depdendencies {
classpath 'com.tutuur.android:navigator-plugin:0.9.14'
}
}