今天在编写代码的时候,涉及到两个Activity通过Intent来传值的问题。具体描述为:activity A调用 startActivityForResult()函数启动Activity B,然后B结束时通过setResult()函数将一些值回传给A。
笔者过 去使用这种方法很多次,屡试不爽。但是,今天居然出现了一个奇怪的现象,即从B跳回A后并没有按照 预想的逻辑执行,通过抓Log发现,当从A启动B的时候,A中的onActivityResult()和onResume()函数均 被执行。完全不符合逻辑。
后来查资料,有人提到这可能与将要跳转的Activity B的启动模式相关。
特别是当Activity使用singleTask模式启动的时候,不能使用startActivityForResult()函数,否则就会出现立即 执行onActivityResult()函数。
解决方法将要跳转的Activity B的启动模式改为标准模式,问题得到解决。
从柯 元旦的《Android 内核剖析》的第十章“Ams内部原理“10.1.3中有这样的一段话:请注意: SINGLE_TASK标识以及SINGLE_INSTANCE两个标识必 须在r.result==0的条件中,即这两个标识只能用 在startActivity()的方法中,而不能使用在 startActivityForResult方法中。因为从Task的角度看,Android认 为不同Task之间的Activity是不能传递数据 的,所以不能使用NEW_TASK标识,但还是要调用forResult 方法.
如图:假设当前的应用程序存在两个栈:其中一个直接显示在屏幕上负责与用户完成交互,叫 BackStack;另一个是隐藏在后台的background task,且位于该栈顶的Activity Y的启动模式被设置为 singleTask。
如果Activity 2中调用background Task中已经启动过的Activity Y,则background Task内占据屏幕并 且将该Task下所有的栈保留当前的栈位置和顺序push进back Task形成新的结构。在Activity界面按返回 键,则Activity Y出栈,Activity X占据屏幕。因此可见,由Activity2调用的Activity Y,但返回键后,回退调用startActivityForResult后,onActivityResult为什么立刻响应 显示的是Activity X。所以,即使在Activity执行setResult()函数,Activity2也是无法接收到的。
由于这种现象的存在,所以android系统处于某种保护机制,发现将要跳转的Activity的启动模式是 singleTask时,若需要执行onActivityResult()函数则立即执行。
相关推荐
在此基础上,我们可以通过类似的思想实现`startActivityForResult`的响应处理,无需重写`onActivityResult`。 首先,理解`RxPermissions`的工作原理至关重要。这个库的核心在于将权限请求转换为一个Observable序列...
`startActivityForResult()`是Intent的一种特殊用法,它允许一个Activity启动另一个Activity,并期望在新Activity执行完特定操作后返回结果。下面将详细阐述`startActivityForResult()`的工作原理及其在实际开发中的...
当我们在Activity A中调用`startActivityForResult(Intent intent, int requestCode)`时,其中`intent`是用于启动新Activity的Intent,`requestCode`是一个整数值,用于在`onActivityResult()`中区分不同的请求。...
下载头像的过程则相反,通过服务器返回的URL,创建一个GET请求,获取响应后将二进制数据保存为本地文件。 `AvatarManager`可能是一个类,负责整个流程的管理,包括调用相机、相册,裁剪图片,上传下载等操作。它...
要调用相机应用,可以创建一个`Intent`,设置其动作为`ACTION_IMAGE_CAPTURE`,然后通过`startActivityForResult()`启动。例如: ```java Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)...
在Android系统中,调用其他Camera应用拍照是一个常见的功能需求,尤其在开发涉及图像处理的应用时。本篇文章将深入探讨如何实现这一功能,并基于提供的链接(由于无法直接访问,这里将根据常见做法进行讲解)来解析...
在Android开发中,调用系统相册和相机是常见的用户交互功能,这使得用户能够方便地选择或拍摄图片,进一步丰富应用的体验。本实例源码提供了如何在Android应用程序中实现这两个功能的具体方法。 首先,调用系统相册...
在Android应用开发中,调用系统相机拍照和访问相册是常见的功能,用户可以通过这些功能获取并处理图像。本文将详细讲解如何实现这两个功能,并提供一个名为`TakePhotoDemo`的示例项目作为参考。 首先,调用系统相机...
如果存在这样的应用,`startActivityForResult()`会被调用,这样当用户完成拍照后,控制权会返回到我们的应用,并触发`onActivityResult()`方法。 对于录制视频,我们需要创建一个ACTION_VIDEO_CAPTURE的Intent: ...
创建一个`Intent`,设置其动作为`MediaStore.ACTION_IMAGE_CAPTURE`,然后通过`startActivityForResult()`启动,这样当用户完成拍照后,系统会回调指定的方法,传递回拍摄的照片。 2. **创建图片文件**: 在调用...
当用户拍摄完照片后,系统会返回到我们的应用,并调用`onActivityResult`方法。我们需要在这里处理返回的结果,比如保存照片: ```java @Override protected void onActivityResult(int requestCode, int ...
当用户拍摄完照片并关闭相机应用后,系统会调用`onActivityResult()`方法。我们需要在这个方法中处理返回的结果: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent ...
拍照完成后,`onActivityResult()`会被调用,返回的是拍摄的照片。需要注意的是,拍摄的照片默认存储在系统的临时缓存目录,你可能需要保存到应用私有的存储空间: ```java @Override protected void ...
创建一个`Intent`对象,设置其动作为`ACTION_VIDEO_CAPTURE`,然后使用`startActivityForResult()`方法启动相机应用。这样,用户可以拍摄视频,完成后返回到你的应用。 接下来,**录制视频**。当相机应用返回结果时...
1. 将裁剪后的图片转换为byte数组或文件:可以使用`Bitmap.compress()`方法将Bitmap转换为JPEG格式的字节数组。 ```java ByteArrayOutputStream baos = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap....
例如,用户可能取消了操作或者编辑后保存,你可以通过重写`onActivityResult()`方法来处理这些情况。 7. **特殊情况** 有时,WPS可能无法识别某些MIME类型,这时你可能需要尝试其他的MIME类型,或者直接使用文件的...
- 结果处理:同样在`onActivityResult`方法中处理裁剪后的结果。 4. **兼容性处理** - 针对不同Android版本,使用不同的方法解析`Uri`指向的实际路径。 5. **权限管理** - 在运行时动态请求存储权限和相机权限...
在Android开发中,调用系统相机、图库以及图片裁剪和上传是常见的功能需求,尤其是在构建具有多媒体交互的应用时。这份"Android高级应用源码-android 调用系统相机图库裁剪-图片上传-客服端(测试可用).zip"的资源...
在Android应用开发中,`EditText` 是一个...而调用系统通讯录界面则需要使用`Intent`和`ACTION_PICK`操作,以及处理返回结果的`onActivityResult()`方法。在实际开发中,根据项目需求,这些功能可以灵活地组合和扩展。