Log.e("Rain",selectInfo.getName() + "--------onActivityResult----------");
XRouter.getRouter().getActivityManager().onActivityResult(this, requestCode, resultCode, data);
}
服务的实现类
@Route(path = IActivityManagerService.PATH)
public class ActivityManagerImpl implements IProvider, IActivityManagerService {
private Context mContext;
private List
@Override
public void init(Context context) {
mContext = context;
}
@Override
public Context getContext() {
if (ActivityUtils.getTopActivity() == null)
return mContext;
else return ActivityUtils.getTopActivity();
}
@Override
public void addOnActivityResultListener(OnActivityResultListener listener) {
if(mOnActivityResultListeners == null){
mOnActivityResultListeners = new ArrayList<>();
}
if(!mOnActivityResultListeners.contains(listener)){
mOnActivityResultListeners.add(listener);
}
}
@Override
public void onActivityResult(Activity context, int requestCode, int resultCode, Intent data) {
if(mOnActivityResultListeners != null && !mOnActivityResultListeners.isEmpty()){
for(OnActivityResultListener listener : mOnActivityResultListeners){
listener.onActivityResult(context, requestCode, resultCode, data);
}
}
}
}
调用方式:
public IActivityManagerService getActivityManager() {
ActivityManagerImpl activityManagerImpl = (ActivityManagerImpl)ARouter.getInstance()
.build(IActivityManagerService.PATH)
.navigation();
return activityManagerImpl;
}
第二步我们需要做路由跳转服务的实现 类似:
XRouter.getRouter()...startActivityForResult(new ResultCallback() {br/>@Override
public void onResponse(@NonNull Object data) {
那么我们跳转时传递参数必须先拿到一个PostCard,通过PostCard可以传递我们目标页面所需的数据
Postcard mPostcard = ARouter.getInstance().build(path);
通过new NavigatorBuilder(String path)
可以拿到NavigatorBuilder对象:
NavigatorBuilder navigator = new NavigatorBuilder(path);
//方法注解br/>@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Route {
//方法参数注解br/>@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Extras {
}
public interface AppNavigator {
String _selectPage = "/select/contactActivity";
@Route(path = _selectPage)
ActivityNavigator
}
这里其实使用的是动态代理,内部也是通过Java反射机制实现的,即已知的一个对象,然后在运行时动态调用其方法,这样在调用前后作一些相应的处理。
try {
o = Proxy.newProxyInstance(navigator.getClassLoader(), new Class[]{navigator}, new InvocationHandler() {
LruCache
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (mNavigatorMethods == null) {
mNavigatorMethods = new LruCache<>(5);
}
NavigationMethod navigationMethod = mNavigatorMethods.get(method);
if (navigationMethod == null) {
// create methods processer
navigationMethod = new NavigationMethod(method);
mNavigatorMethods.put(method, navigationMethod);
}
return navigationMethod.invoke(args);
}
});
}catch (Exception e){
Log.e("Rain",e.getMessage() + "-----------");
}
;
Navigator navigator = builder
.withRequestCode(mRoute.requestCode())
.navigator();
return navigator;
}
我们在ContactSelectInfoCallback中解析了返回的intent对象,并通过onResponse方法返回具体的数据对象。
public abstract class RouteCallback
public abstract T parseData(int requestCode, int resultCode, @NonNull Intent data);
public abstract void onResponse(@NonNull T data);
public void onError(Throwable throwable){}
使用方式
1. 声明Navigator接口
public interface AppNavigator {
String _selectPage = "/select/contactActivity";
2. 复写onActivityResult方法
3. 实现Callback,对回传数据进行解析处理
public abstract class ContactSelectInfoCallback extends RouteCallback
@Override
最后
Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。
人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。