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

(0)

相关推荐

  • Android startActivityForResult和setResult的区别

     Android startActivityForResult和setResult的区别 startActivityForResult与startActivity的不同之处在于: 1.startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( ). 2.startActivityForResult( ) 可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Tex

  • Android onActivityResult和setResult方法详解及使用

    Android onActivityResult和setResult方法 最近做公司项目遇到Android onActivityResult和setResult ,在应用过程中进程报错,这里有必要记录下,以免再次使用出错. 如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activi

  • Android startActivityForResult实例详解

    Android startActivityForResult实例详解 startActivityForResult用于两个activity之间的数据传递,Activity1传值给Activity2,Activity2再返回值给Activity1. 第一步:Activity1中:startActivityForResult(Intent intent, Int requestCode) Intent intent = new Intent(); intent.setClass(Activity1.

  • Android getJSONObject与optJSONObject的区别结合源码分析

    Android getJSONObject与optJSONObject的区别结合源码分析 json解析常见问题: getJSONObject与optJSONObject的区别,下面结合源码和案例来分析当我们使用这两周方法来解析数据时,哪种比较好. 源码分析: //使用getJSONObject时,如果返回的对象不是JSONObject,抛出JSONException异常 /** * Returns the value mapped by {@code name} if it exists and

  • Android startActivityForResult的基本用法详解

    知识准备: 1.startActivityForResult(Intent intent, int requestCode):启动 Activity,同时等待该 Activity 返回数据.只有该 Activity 销毁时数据才会被返回. 参数 1:意图,封装要启动的 Activity,当然也可以携带数据 参数 2:请求码,如果是大于 0 的整数,那么该请求码会在 onActivityResult 中的 requestCode中出现,如果小于等于 0,则不会被返回. 2.onActivityRe

  • startActivityForResult和setResult案例详解

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

  • Android 中clipToPadding 和 clipChildren区别和作用

    Android 中clipToPadding 和 clipChildren区别和作用 Android 关于 clipToPadding 和 clipChildren区别和作用对于这两个属性那也是很神奇, 1.对于clipToPadding 默认是true, 这个属性一般都是viewgrounp对象才会用到, 他的意思就是 对于padding 所占的尺寸大小也绘制 其他的item的view, 2.对于clipChildren 默认是true,这个属性是让子view不受父view大小的限制,可以超过

  • 深入剖析Android中Service和Thread区别

    Service既不是进程也不是线程,它们之间的关系如下: 可能有的朋友会问了,既然是长耗时的操作,那么Thread也可以完成啊.没错,在程序里面很多耗时工作我们也可以通过Thread来完成,那么还需要Service干嘛呢.接下来就为大家解释以下Service和Thread的区别. 首先要说明的是,进程是系统最小资源分配单位,而线程是则是最小的执行单位,线程需要的资源通过它所在的进程获取. Service与Thread的区别: Thread:Thread 是程序执行的最小单元,可以用 Thread

  • 基于Android MarginLeft与MarginStart的区别(详解)

    我们在写layout布局的时候,我们会发现有这样几个比较相似的属性: MarginStart   MarginLeft MarginEnd    MarginRight 这些属性的区别是什么?  根据api注释,我们得知MarginStart指的是控件距离开头View部分的间距大小,MarginLeft则指的是控件距离左边View部分的间距大小,MarginEnd和MarginRight同理. 一般情况下,View开始部分就是左边,但是有的语言目前为止还是按照从右往左的顺序来书写的,例如阿拉伯语

  • 浅谈android @id和@+id的区别

    今天,简单讲讲android里关于@id和@+id的区别. 之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别.于是就在网上查找资料,最终是解决了问题.这里记录一下. Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后面使用"+",表示当修改完某个布局文件并保存后,系统会自动在R.

随机推荐