Android startActivityForResult和setResult的区别

 更新时间:2017年08月29日 11:53:38   投稿:lqh  
这篇文章主要介绍了 Android startActivityForResult和setResult的区别的相关资料,希望通过本文能帮助大家理解这部分内容,需要的朋友可以参考下

 Android 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 startActivityForResult和setResult的区别,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 超实用的android网络工具类

    超实用的android网络工具类

    这篇文章主要为大家详细介绍了超实用的android网络工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Android WebView 应用界面开发教程

    Android WebView 应用界面开发教程

    WebView组件本身就是一个浏览器实现,开发者可以直接在WebView中使用聚合(Polymer)和Material设计。接下来通过本文给大家介绍Android WebView 应用界面开发教程,一起看下吧
    2016-08-08
  • Android自定义控件实现滑动开关效果

    Android自定义控件实现滑动开关效果

    这篇文章主要为大家详细介绍了Android自定义控件实现滑动开关效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 全面解析Android应用开发中Activity类的用法

    全面解析Android应用开发中Activity类的用法

    这篇文章主要介绍了Android应用开发中Activity类的用法,包括Activity间的数据传递以及Activity的创建方式等,需要的朋友可以参考下
    2016-02-02
  • Mac中Eclipse连不上Android手机的解决方法

    Mac中Eclipse连不上Android手机的解决方法

    这篇文章主要介绍了Mac中Eclipse连不上Android手机的解决方法,本文方法同样适用其它的移动设备,需要的朋友可以参考下
    2015-06-06
  • Flutter 中 Dart的Mixin示例详解

    Flutter 中 Dart的Mixin示例详解

    这篇文章主要介绍了Flutter 中 Dart的Mixin的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • android预置默认的语音信箱号码具体实现

    android预置默认的语音信箱号码具体实现

    在此介绍以xml的方式预置VM number的方法,以及如何允许用户去修改并能够记住用户的选择
    2013-06-06
  • Android开发从相机或相册获取图片裁剪

    Android开发从相机或相册获取图片裁剪

    当我们需要上传图片时,想要裁剪成我们需要的尺寸大小,android手机都带有这个功能,很容易,那么此功能是如何实现的呢?下面小编给大家介绍Android开发从相机或相册获取图片裁剪,需要的朋友可以参考下
    2015-10-10
  • Android富文本实现的几种方式汇总

    Android富文本实现的几种方式汇总

    由于项目中需要使用到富文本显示和编辑,索性整理下,这篇文章主要给大家介绍了关于Android富文本实现的几种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Android后台启动Activity的实现示例

    Android后台启动Activity的实现示例

    这篇文章主要介绍了Android后台启动Activity的实现示例,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-04-04

最新评论