当前位置: 移动技术网 > IT编程>移动开发>Android > Android startActivityForResult和setResult的区别

Android startActivityForResult和setResult的区别

2019年07月24日  | 移动技术网IT编程  | 我要评论

金湖县,随州汽车站,手机wap网站

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网