Comments (10)
我尝试自定义了一个CustomBrowserMatcher,在init之后注册,并且优先级高于BrowserMatcher的0
Router.initialize(this, debug);
Router.registerMatcher(new CustomBrowserMatcher(1));
public class CustomBrowserMatcher extends AbsMatcher {
public CustomBrowserMatcher(int priority) {
super(priority);
}
@Override
public boolean match(Context context, Uri uri, @Nullable String route, RouteRequest routeRequest) {
return !this.isEmpty(route) && (uri.toString().toLowerCase().startsWith("http://") || uri.toString().toLowerCase().startsWith("https://"));
}
@Override
public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
if (target != null && Activity.class.isAssignableFrom(target)) {
Intent intent = new Intent(context, BrowserActivity.class);
BrowserParam browserParam = new BrowserParam();
browserParam.setUrl(uri.toString());
Bundle bundle=new Bundle();
bundle.putSerializable("browser", browserParam);
intent.putExtras(bundle);
return intent;
} else {
return null;
}
}
}
现在的情况确实先被这个CustomBrowserMatcher捕获,但是产生了两个新疑问:
- 居然被一个未在任何地方加入的RouteInterceptor拦截了
- generate方法中无法获取到跳转时候传入的参数
from router.
- 可以继承自
BrowserMatcher
或者AbsImplicitMatcher
,AbsMatcher
有两个子类:AbsExplicitMatcher
处理显式Intent,AbsImplicitMatcher
处理隐式Intent,如果不继承自AbsImplicitMatcher
,会被当成显式的情况,会走拦截器的逻辑,这块我会考虑能不能优化。 - generate专注与处理目标对象的生成,不操作跳转参数,你可以在
match
方法内操作RouteRequest
,比如routeRequest.setXXX
。
from router.
问题1的出现原因参考这块代码
from router.
谢谢
我改为继承自BrowserMatcher以后,问题1解决了。
但是问题2还是有疑问,generate专注于目标对象的生产,目标对象我希望跳转到自定义的BrowserActivity,然后在generate中生成跳转intent,但是在generate中只有uri,没有其他的router.build的时候with的参数,请教一下,我要怎么操作,才可以在我的目标BrowserActivity中获取到with的参数?
@Override
public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
//return super.generate(context, uri, target);
if (target != null && Activity.class.isAssignableFrom(target)) {
Intent intent = new Intent(context, BrowserActivity.class);
BrowserParam browserParam = new BrowserParam();
browserParam.setUrl(uri.toString());
Bundle bundle = new Bundle();
bundle.putSerializable("browser", browserParam);
intent.putExtras(bundle);
return intent;
} else {
return null;
}
}
from router.
你不需要操作bundle,什么也不需要做,在生成intent之后,会自动把bundle传入intent内,在目标页面直接获取即可。参见这里。
from router.
收到,多谢指导。
from router.
先贴上我自定义的CustomBrowserMatcher
public class CustomBrowserMatcher extends BrowserMatcher {
public CustomBrowserMatcher(int priority) {
super(priority);
}
@Override
public boolean match(Context context, Uri uri, @Nullable String route, RouteRequest routeRequest) {
return super.match(context, uri, route, routeRequest);
}
@Override
public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
return target != null && Activity.class.isAssignableFrom(target) ? new Intent(context, BrowserActivity.class) : null;
}
}
我再App中做了注册
init router
Router.initialize(new Configuration.Builder()
.setDebuggable(BuildConfig.DEBUG)
.registerModules("app")
.build());
Router.registerMatcher(new CustomBrowserMatcher(1));
以上代码再1.3.x中是正常工作的,最近升级到1.4.0,发现对于http的跳转不起作用了,debug发现在CustomBrowserMatcher.generate中target是null
from router.
1.3.3同样存在问题
1.3.2正常工作
from router.
BrowserMatcher
继承自AbsImplicitMatcher
(即只处理隐式intent),隐式Matcher里的target都为null,代码逻辑在这,所以你需要把你的自定义Matcher改为继承AbsExplicitMatcher
或者它的子类(显式处理器才能接收到target),注意协调好Matcher的优先级问题。抱歉给你带来的困扰。
from router.
非常感谢,贴上正常工作后的代码
public class CustomBrowserMatcher extends AbsExplicitMatcher {
public CustomBrowserMatcher(int priority) {
super(priority);
}
@Override
public boolean match(Context context, Uri uri, @Nullable String route, RouteRequest routeRequest) {
return (uri.toString().toLowerCase().startsWith("http://") || uri.toString().toLowerCase().startsWith("https://"));
}
@Override
public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
return super.generate(context, uri, BrowserActivity.class);
}
}
from router.
Related Issues (20)
- AppInterceptorsHandler看代码一个问题,会导致公共拦截器和私有拦截器执行顺序混乱 HOT 1
- android 6.0 出现的内存溢出 HOT 1
- [Router 1.7.5]每次构建路由表都会发生变化,导致编译速度变慢 HOT 3
- 编译时遇到java.lang.reflect.InvocationTargetException HOT 2
- 希望可以支持onActivityResult 和activity解藕 HOT 2
- jcenter即将关闭,请问何时迁移? HOT 2
- Build 发生异常 HOT 1
- 1.7.5版本在release包中 mSettingFragment是null HOT 2
- Kotlin 1.5.20 版本编译报错 HOT 1
- 部分Module 不生效 HOT 12
- 版本1.8.0,如果module的application为光秃秃的<application>。则报错org.xml.sax.SAXParseException; lineNumber: xxx; columnNumber: xxx; The prefix "android" for attribute "android:name" associated with an element type "meta-data" is not bound. HOT 3
- 有时候跳转没反应。请问是什么原因呢。1.7.6 HOT 12
- 可以适配下Android12吗 HOT 1
- '元素类型 "uses-sdk" 必须后跟属性规范 ">" 或 "/>"。' HOT 13
- fragment跳转fragment未生效? HOT 2
- 1.8.1Cannot invoke method appendNode() on null object HOT 26
- 开启混淆后运行报错 java.lang.AbstractMethodError HOT 4
- Cannot invoke method appendNode() on null object HOT 13
- 支持scheme协议吗 HOT 1
- No option `moduleName` passed to Route annotation processor. HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from router.