Android利用startActivityForResult返回数据到前一个Activity
在android里面,从一个activity跳转到另一个activity、再返回,前一个activity默认是能够保存数据和状态的。但这次我想通过利用startactivityforresult达到相同的目的,虽然看起来变复杂了,但可以探索下startactivityforresult背后的原理和使用注意事项。
要实现的功能如下:
从activity a将数据传到activity b,再从activity b中获取数据后,再传回activity a。在activity b中添加一个“回到上一页”的button,返回到activity a之后,需要保留之前输入的相关信息,我们用startactivityforresult来拉起activity b,这样,activity a就会有一个等待activity b的返回。
具体步骤如下:
- 在activity a中有一个button,点击button后,获取要传到activity b的数据,将数据封装到bundle中,再调用startactivityforresult将数据传到activity b
- activity a 重写onactivityresult函数,判断requestcode和resultcode是否是我们预期的结果,如果是,那么从bundle中获取数据,重新显示在activity a中
- 在activity b中获取activity a传过去的intent对象,并取出bundle对象,再从bundle中取出数据字段,显示在当前页面
- activity b中也有一个button,点击button后,调用setresult传回结果,并关闭当前页面。因此,看起来的效果就是回到了activity a
源码如下:
1、activity a的实现:
2、布局文件main_page_layout.xml:
3、activity b的实现:
4、activity b的布局:
不过这里有3个地方需要注意:
1.startactivityforresult的第二个参数requestcode传的是0,那么我们分别看下传递的值小于0和大于0是什么结果:
(1)传一个小于0的值,比如-1:等同于调用 startactivity,onactivityresult不会被调用
(2)传一个大于0的值,比如1:效果等同于传0,onactivityresult的第一个参数正是我们通过startactivityforresult传递的requestcode
2.onactivityresult的第二个参数resultcode:它是第二个activity通过setresult返回的,常用的取值有2个:result_canceled、result_ok
(1)result_canceled:activity b拉起失败,比如crash
(2)result_ok:activity b操作成功后的返回值
还有一个不太常用的取值:result_first_user,android源码对这个取值的定义是“user-defined activity results”(用户自定义的),我在源码中全局搜索了下,用的地方不多,挑了一两个使用的地方:
(1)packageinstaller下面的installfailed.java(安装apk失败的相关页面)
(2)packageinstaller下面的installstaging.java
packageinstaller下面的uninstalleractivity.java(卸载apk的相关页面):在oncreate方法里面有多处设置为result_first_user。
因此,我的理解是业务自身在一些错误或无效的场景下使用,由业务自己定义。
3. 如果启动activity b时设置了new_task启动模式,进入activity b后,activity a会立即回调onactivityresult,而且resultcode是0;从activity b setresult返回后,不再有onactivityresult的回调!
以上就是android利用startactivityforresult返回数据到前一个activity的详细内容,更多关于android 返回数据到前一个activity的资料请关注其它相关文章!
上一篇: C#中OpenCVSharp实现轮廓检测