基于ARouter实现startActivityForResult的链式调用

本文介绍了如何基于ARouter扩展功能,实现在Android中类似Retrofit的链式调用来处理onActivityResult的回传数据。通过创建接口、动态代理和注解,实现了更方便的路由跳转和数据解析。
摘要由CSDN通过智能技术生成

Android

前言

什么是ARouter?如果你想知道什么是ARouter的话,现在就带你研究… 什么是ARouter …

开玩耍… 今天不对ARouter的使用做过多讲解,如果有对ARouter不了解的童鞋可以移步ARouter 官方学习。今天主要是基于ARouter做一些扩展,来波不是骚操作的骚操作~

如何通过ARouter实现类Retrofit链式调用onActivityResult ?


我们都知道启动另外一个Activity有俩种方式:

  1. 使用startActivity()
  2. 使用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)){
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条苍老的小鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值