是时候干掉onActivityResult了

原创 2017年11月14日 19:08:41

两个冤家,handler与onActivityResult

安卓中有两个我们常用,但写起来非常不爽的代码。一个是handler,另一个就是onActivityResult了。他们非得让我们都整一个常量,而且看代码时请求和处理逻辑之间跳来跳去。一个字,晕。
我们知道handler大部分用在网络请求上,至于去掉可以看我以前的文章安卓项目易用Ohttp封装,当然这个网络请求封装很多。但对onActivityResult封装的并不多。

要实现的目标代码

这里我要说下,当我们想实现一个东西时。不是先想怎么实现,而是先想我们要实现什么样的,首先我们不要requestCode,其次我们要回调:

 startActivityForResult(new Intent(this, MainActivity.class), new ResultBack() {
            @Override
            public void resultOk(Intent data) {
                //to do what you want when resultCode == RESULT_OK
            }
        });

实现分析

1.有人说使用进程注入的方式hook系统的activity数据发送,这个不好实现,也不建议这样。
2.使用代理的Activity或fragment,如果使用单例,就需要解决不同activity回调的生命周期,而使用每个新建一个的话,每个请求new一个activity或fragment对象开销太大。
3.进行简单封装,跟随调用对象的生命周期,这个简单,而且易于使用和理解。

实现代码

首先我们看到上面有个回调接口,只写了成功的部分,有同学就问,你这我怎么处理失败或其他自定义的resultCode,看代码:

public abstract class ResultBack {
    public abstract void resultOk(Intent data);
    public void resultElse(int resultCode, Intent data){
    //可以吧,如果要处理其他情况只需重写此方法。大部分时候我们是不要用的
    }
}

简单封装

重点来了,我们是怎么干掉requestCode的呢?说简单也简单,相信你一看就懂。只需在基类BaseActivity和BaseFragment加上下面这些代码就行了

private ArrayList<ResultBack> list = new ArrayList<>();//保存所有activity返回的回调,跟随activity生命周期

public synchronized void startActivityForResult(Intent intent, ResultBack resultBack) {
     if (list.indexOf(resultBack) < 0) {
         list.add(resultBack);
         startActivityForResult(intent, list.size());//requestCode就是list的Index,哈哈哈
     }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
         list.get(resultCode).resultOk(data);
    } else {
        list.get(resultCode).resultElse(resultCode, data);
    }
    list.set(requestCode, null);//释放已返回的ResultBack,不用remove防止乱序
}

小优化

因为每个请求会生成一个ResultBack回调对象,点击一下生成一个,所以建议这样用,当然也可以不用,因为点了就跳了也点不了几下:

private ResultBack mainBack = new ResultBack() {
     @Override
     public void resultOk(Intent data) {
     }
};
public void any(){
    startActivityForResult(new Intent(this, MainActivity.class), mainBack);
}
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/wanyouzhi/article/details/78533888

onActivityResult的用法

主要功能: 在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity...
  • Double2hao
  • Double2hao
  • 2015-12-13 09:56:02
  • 14189

再也不需要onActivityResult了。使用响应式解决startActivityForResult和onActivityResult回调繁琐的问题

每次我们使用startActivityForResult方法时,如果需要接收返回的结果,总得在onActivityResult中进行处理。 学习了RxJava以后,体验到了操作符的便捷。因此尝试着解决...
  • u014165633
  • u014165633
  • 2017-02-08 20:21:06
  • 1130

Android Activity 中 onActivityResult() 与 setResult()

在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。这样的数据交...
  • xuzhoude_han
  • xuzhoude_han
  • 2017-02-24 09:55:09
  • 842

Android开发基础 startActivityForResult()、onActivityResult()和setResult()方法之间的联系

在以前开发的时候,只是使用过,知道如果要是想从上一个Activity中得到处理的一些状态需要调用这几个方法,但是这几个方法中的参数老是记忆的很混乱,今天在开发项目的时候,忽然想到了一些东西,特意记下免...
  • L_zhp
  • L_zhp
  • 2016-03-29 21:51:21
  • 2689

onActivityResult回调的用法

ActivityA跳转到AddAddressActivity ActivityA中的内容 Intent intent = new Intent(this,AddAddressActivity.cl...
  • w13080042891
  • w13080042891
  • 2016-11-07 14:10:49
  • 453

调用startActivityForResult后直接调用onActivityResult

人员都知道,可以经由过程应用 startActivityForResult() 和 onActivityResult() 办法来传递或接管参数。 然而在“轻听”项目中,还没比及被调用的 Activ...
  • u013270444
  • u013270444
  • 2016-10-13 09:56:08
  • 492

Android中的onActivityResult和setResult方法的使用

如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2013-11-27 12:11:32
  • 142373

onActivityResult中调用startActivityForResult接收不到返回值

周五的时候同事遇到一个bug,有两个activity A,B,A调用startActivityForResult启动B,然后B返回数据给A,本来是想要A的onActivityResult接收到数据后继...
  • TAOMINGWANG
  • TAOMINGWANG
  • 2016-11-13 18:35:16
  • 1404

Activity的onActivityResult 接收不到返回结果的解决办法

activityA通过startActivityForResult 启动activityB,要想在A的onActivityResult中拿到返回值,activityB的启动模式不能设置为“single...
  • noobzsb
  • noobzsb
  • 2017-04-28 10:12:23
  • 548

Activity的生命周期函数、onActivityResult、intent和启动模式的调用关系

将activity的启动模式和intent传值问题进行了总结和思考
  • cbzcbzcbzcbz
  • cbzcbzcbzcbz
  • 2017-07-25 11:14:00
  • 688
收藏助手
不良信息举报
您举报文章:是时候干掉onActivityResult了
举报原因:
原因补充:

(最多只允许输入30个字)