文档章节

startActivityForResult 和 setResult 详解

华山猛男
 华山猛男
发布于 2017/01/24 15:53
字数 773
阅读 10
收藏 0

startActivityForResult与startActivity的不同之处在于:
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个T2Activity,而当这个T2Activity调用了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;
    }
}

或其他写法

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	super.onActivityResult(requestCode, resultCode, data);
	if (requestCode == 0 && data != null) {
	     data.getBooleanExtra("avatar", false));
        }	
    }
}

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()方法好.

 

本文转载自:http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html

华山猛男
粉丝 10
博文 179
码字总数 84845
作品 0
海口
程序员
私信 提问
startActivityForResult用法

startActivityForResult与startActivity的不同之处在于: · startActivity( ):仅仅是跳转到目标页面,若是想跳回当前页面,则必须再次调用startActivity( )。 · startActivityForResult( ...

ord1nary
2014/04/16
0
0
Activity数据传递详解

唉,好久都没有写过博客了。真的是太懒了。最近在看《Android权威编程指南》,挺不错的一本书,感觉里面有很多开发规范,是很值得一看的一本书。 感觉在工作中经常处理Activity之间的数据传递...

一本未写完的书
2017/11/12
0
0
startActivityForResult用法详解

一、如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前...

深谷不见幽兰
2014/04/21
0
0
android setResut intent ==null?

在activity A中startActivityForResult 在activity B中代码如下 @Override protected void onPause() { super.onPause(); Intent intent=new Intent(); intent.putExtra("currentSelectPhot......

风中女程序员
2015/01/14
0
0
调用startActivityForResult,onActivityResult无响应的问题

三种情况: 一、执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了。 这与 Activity 的加载模式(launchMode)有关,该属性可以在 AndroidManifes...

open_虎皮猫
2015/11/26
21
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机网络

计算机网络体系结构 OSI 其中表示层和会话层用途如下: 表示层 :数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。 会话层 :建立及管理会话。 五层...

一只小青蛙
54分钟前
2
0
0.01-Win10安装linux子系统

一、安装Debian子系统 -1、控制面板设置: -1.1、打开“控制面板” —— “程序” —— “启用或关闭Windows功能” —— 勾选 “适用于Linux的Windows子系统” -2、设置: -2.1、打开“设置”...

静以修身2025
昨天
2
0
init 0-6 (启动级别:init 0,1,2,3,4,5,6)

启动级别: init 0,1,2,3,4,5,6 这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下。。 0: 停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system...

圣洁之子
昨天
2
0
Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

天王盖地虎626
昨天
2
0
聊聊Elasticsearch的ProcessProbe

序 本文主要研究一下Elasticsearch的ProcessProbe ProcessProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java public class ProcessProb......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部