`

调用startActivityForResult后,onActivityResult为什么立刻响应

 
阅读更多

今天在编写代码的时候,涉及到两个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()函数则立即执行。

 

 
  • 大小: 150.9 KB
分享到:
评论

相关推荐

    Android-基于RxPermissions框架思想在使用startActivityForResult可以不重写onActivityResult回调

    在此基础上,我们可以通过类似的思想实现`startActivityForResult`的响应处理,无需重写`onActivityResult`。 首先,理解`RxPermissions`的工作原理至关重要。这个库的核心在于将权限请求转换为一个Observable序列...

    Android之Intent通过startActivityForResult方法启动新Activity

    `startActivityForResult()`是Intent的一种特殊用法,它允许一个Activity启动另一个Activity,并期望在新Activity执行完特定操作后返回结果。下面将详细阐述`startActivityForResult()`的工作原理及其在实际开发中的...

    Android-一种startActivityForResult更简单流程

    当我们在Activity A中调用`startActivityForResult(Intent intent, int requestCode)`时,其中`intent`是用于启动新Activity的Intent,`requestCode`是一个整数值,用于在`onActivityResult()`中区分不同的请求。...

    creator实现调用android相机相册,并实现裁剪后图片的上传和下载

    下载头像的过程则相反,通过服务器返回的URL,创建一个GET请求,获取响应后将二进制数据保存为本地文件。 `AvatarManager`可能是一个类,负责整个流程的管理,包括调用相机、相册,裁剪图片,上传下载等操作。它...

    Android中,关于调用系统拍照和图库

    要调用相机应用,可以创建一个`Intent`,设置其动作为`ACTION_IMAGE_CAPTURE`,然后通过`startActivityForResult()`启动。例如: ```java Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)...

    android调用其他Camera应用拍照

    在Android系统中,调用其他Camera应用拍照是一个常见的功能需求,尤其在开发涉及图像处理的应用时。本篇文章将深入探讨如何实现这一功能,并基于提供的链接(由于无法直接访问,这里将根据常见做法进行讲解)来解析...

    Android代码-调用系统相册和系统照相机功能雨实例源码.zip

    在Android开发中,调用系统相册和相机是常见的用户交互功能,这使得用户能够方便地选择或拍摄图片,进一步丰富应用的体验。本实例源码提供了如何在Android应用程序中实现这两个功能的具体方法。 首先,调用系统相册...

    Android 调用系统相机拍照、以及相册

    在Android应用开发中,调用系统相机拍照和访问相册是常见的功能,用户可以通过这些功能获取并处理图像。本文将详细讲解如何实现这两个功能,并提供一个名为`TakePhotoDemo`的示例项目作为参考。 首先,调用系统相机...

    Android如何调用系统现有的照相机拍照与摄像

    如果存在这样的应用,`startActivityForResult()`会被调用,这样当用户完成拍照后,控制权会返回到我们的应用,并触发`onActivityResult()`方法。 对于录制视频,我们需要创建一个ACTION_VIDEO_CAPTURE的Intent: ...

    安卓调用手机摄像机拍照 存储上传+PHP端存储返回

    创建一个`Intent`,设置其动作为`MediaStore.ACTION_IMAGE_CAPTURE`,然后通过`startActivityForResult()`启动,这样当用户完成拍照后,系统会回调指定的方法,传递回拍摄的照片。 2. **创建图片文件**: 在调用...

    Android调用系统相机简单实现

    当用户拍摄完照片后,系统会返回到我们的应用,并调用`onActivityResult`方法。我们需要在这里处理返回的结果,比如保存照片: ```java @Override protected void onActivityResult(int requestCode, int ...

    调用系统自带照相机照相

    当用户拍摄完照片并关闭相机应用后,系统会调用`onActivityResult()`方法。我们需要在这个方法中处理返回的结果: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent ...

    Android从相册选择图片和调用系统摄像头拍照

    拍照完成后,`onActivityResult()`会被调用,返回的是拍摄的照片。需要注意的是,拍摄的照片默认存储在系统的临时缓存目录,你可能需要保存到应用私有的存储空间: ```java @Override protected void ...

    android_调用摄像头拍摄一段视频并上传到服务器

    创建一个`Intent`对象,设置其动作为`ACTION_VIDEO_CAPTURE`,然后使用`startActivityForResult()`方法启动相机应用。这样,用户可以拍摄视频,完成后返回到你的应用。 接下来,**录制视频**。当相机应用返回结果时...

    android调用系统相机图片上传

    1. 将裁剪后的图片转换为byte数组或文件:可以使用`Bitmap.compress()`方法将Bitmap转换为JPEG格式的字节数组。 ```java ByteArrayOutputStream baos = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap....

    Android 调用 wps

    例如,用户可能取消了操作或者编辑后保存,你可以通过重写`onActivityResult()`方法来处理这些情况。 7. **特殊情况** 有时,WPS可能无法识别某些MIME类型,这时你可能需要尝试其他的MIME类型,或者直接使用文件的...

    Android调用相机图库

    - 结果处理:同样在`onActivityResult`方法中处理裁剪后的结果。 4. **兼容性处理** - 针对不同Android版本,使用不同的方法解析`Uri`指向的实际路径。 5. **权限管理** - 在运行时动态请求存储权限和相机权限...

    Android高级应用源码-android 调用系统相机图库裁剪-图片上传-客服端(测试可用).zip

    在Android开发中,调用系统相机、图库以及图片裁剪和上传是常见的功能需求,尤其是在构建具有多媒体交互的应用时。这份"Android高级应用源码-android 调用系统相机图库裁剪-图片上传-客服端(测试可用).zip"的资源...

    EditText右边带删除图标及调用系统通讯录界面

    在Android应用开发中,`EditText` 是一个...而调用系统通讯录界面则需要使用`Intent`和`ACTION_PICK`操作,以及处理返回结果的`onActivityResult()`方法。在实际开发中,根据项目需求,这些功能可以灵活地组合和扩展。

Global site tag (gtag.js) - Google Analytics