`

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

分享到:
评论

相关推荐

    Android onActivityResult和setResult方法详解及使用

    在Android应用程序开发中,`onActivityResult()` 和 `setResult()` 方法是两个非常关键的组件,它们用于在不同的Activity之间传递数据和控制流程。当我们需要从一个Activity启动另一个Activity并期待返回结果时,这...

    startActivityForResult用法详解

    在Android应用开发中,`startActivityForResult`是一个关键的方法,用于启动一个新的Activity并期待返回一个结果。这个方法常用于在不同Activity之间进行数据交互,比如获取用户的选择、处理权限请求等。在这个场景...

    Android startActivityForResult实例详解

    Android startActivityForResult实例详解 Android startActivityForResult是Android中一个非常重要的组件,用于在两个Activity之间传递数据。在本文中,我们将详细介绍Android startActivityForResult实例详解的...

    Android中Intent的详解(显式,隐式,系统,startActivityForResult);

    启动Activity时,通过`startActivityForResult()`,并在目标Activity完成时调用`setResult()`,最后在原始Activity中重写`onActivityResult()`来接收结果。 ```java Intent intent = new Intent(this, ...

    Android基础之startActivityForResult()的用法详解

    `setResult()`将结果码和Intent数据打包,`finish()`关闭`OtherActivity`。 总结起来,`startActivityForResult()`是Android中用于启动Activity并获取返回结果的关键方法。通过请求码和结果码,开发者可以区分不同...

    android intent 实例详解

    ### Android Intent 机制详解 #### 一、Intent 的基本概念 **Intent** 是 Android 四大应用组件(Activity、Service、Broadcast Receiver 和 Content Provider)之间通信的重要桥梁。它是一种消息对象,用来描述一...

    Activity跳转

    通过深入理解`startActivityForResult()`、`setResult()`和`onActivityResult()`等方法的使用,可以更加灵活地管理和控制Activity之间的数据流和状态变化。同时,掌握TextView的可编辑性设置、SaveRestoreState功能...

    android Activity之间数据的回传

    #### 三、`startActivityForResult()`详解 `startActivityForResult()`是一种特殊的Activity启动方式,它可以让我们在启动Activity的同时指定一个请求码(request code),以便于在接收到回传的数据时进行识别。 ###...

    Android编程中Intent实现页面跳转功能详解

    startActivityForResult()方法需要在目标Activity中使用setResult()方法设置返回值,否则将无法获取返回值。 五、实例讲解 下面是一个使用Intent实现页面跳转功能的实例: ```java public class FActivity extends...

    Activity实例详解之启动activity并返回结果

    当我们需要在一个Activity启动另一个Activity并获取返回的结果时,通常会使用`startActivityForResult()`方法和`setResult()`方法来完成这一过程。 1. **启动Activity并返回结果** 当我们需要从一个Activity...

    第6章组件通信与广播消息.pptx

    启动Activity后,可以通过startActivityForResult(Intent, int)方法启动,并在目标Activity中通过setResult(int, Intent)设置结果,然后在调用startActivityForResult()的Activity中重写onActivityResult(int, int, ...

    android画面跳转及传值实例代码

    ### Android Activity间的跳转与数据传递详解 在Android开发中,Activity之间的跳转以及数据的传递是构建应用程序逻辑的关键部分。以下将详细解析一个具体的示例代码,展示如何实现从`Wh4Activity`跳转至`Activity1...

    Android Activity的跳转与传值详解

    如果需要从目标Activity返回数据,可以使用`startActivityForResult(Intent intent, int requestCode)`。其中,`requestCode`是一个自定义的整数,用于在结果回调时区分不同的请求。 在目标Activity中,通过`...

    android编程举例4.docx

    setResult(RESULT_OK, intent); finish(); ``` 3. **接收数据**: - 在启动新的Activity的Activity中,通过重写`onActivityResult()`方法来接收返回的数据。 - 例如: ```java @Override protected void ...

    安卓开发视频教学(完整全集迅雷下载链接)

    - 数据返回机制详解:如何通过setResult()方法将数据从子Activity传回父Activity。 #### 六、常见控件介绍 - **知识点介绍**:介绍安卓开发中常用的UI控件及其基本用法。 - **核心要点**: - TextView、EditText...

    android编程举例.docx编程资料

    - 在主Activity中通过`startActivityForResult`启动新Activity,并在`onActivityResult`方法中处理返回的结果。 通过以上解析,我们了解了如何在Android中使用表格布局构建界面以及如何实现简单的界面交互。这对于...

    新版android开发教程

    ### 新版Android开发教程知识点详解 #### 一、Android编程基础概述 本章节主要介绍了Android应用开发的基础概念和技术要点,适合初学者入门学习。通过学习这部分内容,开发者将能够掌握如何构建基本的Android应用...

Global site tag (gtag.js) - Google Analytics