-
Notifications
You must be signed in to change notification settings - Fork 227
自定义解析规则
Half Stack edited this page Jan 3, 2017
·
6 revisions
Router
默认使用最简单的匹配规则,即完全匹配,"test1"只会匹配"test1",而不会匹配"test",这么设计的原因的是因为每个用户的路由规则可能都不一样,想要"test1"匹配"test"对应的页面,完全可以添加自己的解析规则:
Router.addMatcher(new Matcher() {
@Override
public boolean match(Uri uri, String path) {
return uri.toString().startsWith(path);
}
});
上面只是举了一个比较简单的例子,可以定义自己复杂的路由匹配规则。
Router
还内置了一个常用的UrlMatcher,可以通过Router.addMatcher(new UrlMatcher());
启用。
比如配置如下路由:
@Route({"test", "http://example.com/user?{id}&{status}"})
public class TestActivity extends AppCompatActivity {
...
}
除了可以通过Router.build("test").go(context)
打开TestActivity
之外,还可以通过Router.build("http://example.com/user").go(context)
打开,如果是Router.build("http://example.com/user?id=9527&status=0").go(context)
,不仅能打开页面,还帮你配置了Bundle,你可以从TestActivity
中获取参数:
@Route({"test", "http://example.com/user?{id}&{status}"})
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
String id = getIntent().getStringExtra("id");
String status = getIntent().getStringExtra("status");
}
}
注意:所有的参数都是String
类型,请自己转换为需要的数据类型。
可以看到,UrlMatcher
是个非常棒的解析器,语义性更强,唯一的使用约束就是要使用规范的url串,包含scheme(http)、host:port(example.com)、path(/user,可选)、query(id=9527&status=0,可选)。只要格式正确,custom://abc
也可以使用UrlMatcher
。
用户可以参考UrlMatcher
实现更符合自己业务规则的Matcher
。
Matcher
支持配置多个,会依次进行匹配。