Skip to content

自定义解析规则

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支持配置多个,会依次进行匹配。

Clone this wiki locally