博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android -- startActivityForResult-------&&&----setResult
阅读量:5286 次
发布时间:2019-06-14

本文共 2724 字,大约阅读时间需要 9 分钟。

startActivityForResult与startActivity的不同之处

startActivity( )

仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

startActivityForResult( )

可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

Code

跳转的时候不是采用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

重写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;    }}

在B中回传数据时采用setResult方法,并且之后要调用finish方法。

setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundlefinish();//此处一定要调用finish()方法

setResult()

如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

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();    }

我是天王盖地虎的分割线

 

 

参考:http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html

转载于:https://www.cnblogs.com/AutumnRhyme/p/4273933.html

你可能感兴趣的文章
linux 开机启动过程详解
查看>>
Spark On YARN内存分配
查看>>
apache服务器绑定泛解析域名
查看>>
java web每天定时执行任务(四步轻松搞定)
查看>>
Java学习之自动装箱和自动拆箱源码分析
查看>>
windows下Android(安卓)开发环境搭建 图文教程
查看>>
转载-前端模块化开发的价值
查看>>
ELK学习笔记之ElasticSearch的索引详解
查看>>
怎么针对大批量数据进行分割
查看>>
pyreadline
查看>>
机器学习中使用的神经网络(三)
查看>>
webpack 4.0尝鲜
查看>>
《HTTP权威指南》学习笔记——URL和资源
查看>>
C# 数组、ArrayList和List三者的区别
查看>>
spring缓存
查看>>
android-async-http AsyncHttpClient介绍
查看>>
微信云控开发SDK使用教程--手机端推送好友列表通知服务端
查看>>
高并发情况下分布式全局ID
查看>>
SpringMVC过程中@RequestBody接收Json的问题 总是报415
查看>>
去掉jsessionid
查看>>