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 Libgdx中ScrollPane和Actor事件冲突问题的解决办法
-
Android MeasureSpec的理解和源码的解析
-
Android startActivityForResult和setResult的区别
-
php中str_replace跟str_ireplace的用法和区别
-
php中require和require_once的区别说明_PHP
-
php中全等于===和等于==的区别
-
面向UDP的Android——PC双向通信(三):在Android客户端和PC服务器端之间传输自定义对象
-
H5 canvas中width、height和style的宽高区别详解
-
php中$_REQUEST、$_POST、$_GET的区别和联系小结_PHP
-
详解path和classpath的区别