基于ARouter实现startActivityForResult的链式调用
前言
什么是ARouter?如果你想知道什么是ARouter的话,现在就带你研究… 什么是ARouter …
开玩耍… 今天不对ARouter的使用做过多讲解,如果有对ARouter不了解的童鞋可以移步ARouter 官方学习。今天主要是基于ARouter做一些扩展,来波不是骚操作的骚操作~
如何通过ARouter实现类Retrofit链式调用onActivityResult ?
我们都知道启动另外一个Activity有俩种方式:
- 使用startActivity()
- 使用startActivityOnResult()
startActivityOnResult()
和startActivity()
区别在于startActivityOnResult
可以从B页面回传数据到A页面。
传统启动方式:
startActivityForResult(new Intent(this,OtherActivity.class),REQUEST_CODE);
ARouter启动方式:
ARouter.getInstance().build(String path)
.navigation(Context mContext, int requestCode);
回调:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
那么问题来了!
我想通过Arouter直接回调拿到onActivityResult返回的数据呢?
就像… 这样
ARouter.getInstance().build(String path)
.navigation(Context mContext, int requestCode)
.setOnResultCallback(new OnResultCallback(){
@Override
public void onResponse(Object data){
}
});
分析:
我们想要实现类似如上的方式,正常的ARouter跳转方法肯定是实现不了,我们需要暴露方法提供给他人使用,同时还需要拿到ARouter相关的方法对象。
通过ARouter文档发现,想要提供服务暴露给其他人使用,ARouter提供了一个接口:IProvider
public interface IProvider {
/**
* Do your init work in this method, it well be call when processor has been load.
*
* @param context ctx
*/
void init(Context context);
}
嗯… 这就好办了,我们第一步需要实现的是在onActivityResult
方法中将返回的结果通过路由服务中的方法进行操作
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
SelectInfo selectInfo = (SelectInfo) data.getSerializableExtra("selectInfo");
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<OnActivityResultListener> mOnActivityResultListeners;
@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)){