欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android startActivityForResult和setResult的区别

程序员文章站 2024-02-11 18:11:28
 android startactivityforresult和setresult的区别 startactivityforresult与startactivit...

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