startActivityForResult和setResult详解

转载 2016年06月02日 11:03:34

startActivityForResult和setResult详解

startActivityForResult与startActivity的不同之处在于
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

 

相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

 

简单例子介绍:

1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)

复制代码
Intent intent=new Intent();
intent.setClass(A.this, B.class);
Bundle bundle=new Bundle();
String str1="aaaaaa";
bundle.putString("str1", str1);
intent.putExtras(bundle);
startActivityForResult(intent, 0);//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0
复制代码

2.重写onActivityResult方法,用来接收B回传的数据。

复制代码
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK
   case RESULT_OK:
    Bundle b=data.getExtras(); //data为B中回传的Intent
    String str=b.getString("str1");//str即为回传的值
    break;
default:
    break;
    }
}
复制代码

3.在B中回传数据时采用setResult方法,并且之后要调用finish方法。

setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundle
finish();//此处一定要调用finish()方法

 

Android activity的setResult()在什么时候调用(重点也是难点)

如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?
看一下源码就明白了:

复制代码
public final void setResult(int resultCode, Intent data) {
        synchronized (this) {
            mResultCode = resultCode;
            mResultData = data;
        }
    }

    public void finish() {
        if (mParent == null) {
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
            try {
                if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }
复制代码

这段代码可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的

按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了

@Override
    public void onBackPressed() {
        Log.i(TAG, "onBackPressed");
        setResult(Const.LIVE_OK);
        super.onBackPressed();
    }

当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.

ActivityForResult 在不知道何时返回时,同过重写finish()方法setResult

假设界面A跳到界面B,若界面B需要手动触发才需要返回值,这时候只要setResult,然后finish()当前页面就可以了,但是如果界面B是个列表呢,一组数据需要处理,这时候我们只能在页面关闭的时候s...
  • dhl_1986
  • dhl_1986
  • 2016年08月01日 17:12
  • 1308

使用EventBus代替startActivityForResult向上传递数据

这几天接触了下EventBus,EventBus是一款针对Android优化的发布/订阅事件总线。对于Fragment和Fragment通信,Service和Fragment通信,EventBus是一...
  • My_First_ID
  • My_First_ID
  • 2016年05月05日 16:44
  • 835

startActivityForResult的详细用法及详细使用说明

启动另外一个Activity有两种方法: 1、startActivity()主要作用就是启动acitivty,不可以回传数据。 2、startActivityForResult()主要作用也是启动ac...
  • u010566681
  • u010566681
  • 2016年08月29日 10:55
  • 286

startActivityForResult和setResult在实际项目中的用法举例

 我们知道startActivityForResult( )较startActivity( )而言,不仅可以跳转到下一个activity,而且当被跳转的页面调用finish()后,可以自...
  • CodeIsAWay
  • CodeIsAWay
  • 2017年03月14日 16:13
  • 134

android中setResult的调用时机

最近在做项目的过程中有需要用到返回值,但是由于需求比较复杂,感觉把setResult放到onStop中比较方便,但是发现在onStop中写入setResult(。。。)和finish()之后,跟本就不...
  • haha223545
  • haha223545
  • 2016年09月09日 00:06
  • 1316

activity中 调用startActivityForResult的步骤及生命周期

说明:一个activity需要另一个activity返回结果给其的时候,可以使用startActivityForResult方法 现在有两个activity,分别为ForResultActivity和...
  • u010962131
  • u010962131
  • 2015年08月03日 10:19
  • 3157

关于startActivityForResult你可能不知道的

作为一名Android开发人员
  • jspz11111
  • jspz11111
  • 2014年07月26日 18:20
  • 1155

笔记19--startActivity、startActivityForResult、Bundle--更新传类对象、集合、类对象集合

1、startActivity:仅仅是跳转到目标页面,若想
  • mwj_88
  • mwj_88
  • 2014年04月11日 17:10
  • 2900

【小知识点总结】startActivityForResult 和onActivityResult 的用法及【遇到的问题】

利用startActivityForResult 和 onActivityResult在activity间传递数据 AndroidManifest.xml             android:...
  • Jason_996
  • Jason_996
  • 2015年08月24日 17:58
  • 843

Android开发系列(十三):Intent实现Activity之间的转换以及startActivityForResult传递参数

Intent切换各个Activity以及startActivityForResult()方法来传递参数
  • u010800530
  • u010800530
  • 2014年09月23日 18:10
  • 4315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:startActivityForResult和setResult详解
举报原因:
原因补充:

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