[转]Android Activity的加载模式和onActivityResult方法之间的冲突

前言


今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法。我一开始用log,后来用断点跟踪调试半天,还是百思不得其解。因为之前其他的Activity的LaunchMode都是Normal,没有特殊设定,这个Activity由于需求改成了singleTop。直到我确定没有一个地方是代码主动触发的,我才想到了跟Activity的LaunchMode是否有关。

探索

在Google上搜索android activity onactivityresult
singTop找到了一些问题。


stackoverflow


stackoverflow上有些人跟我遇到的问题类似。比如说有一位开发者把Activity设置成了singleTask模式,onActivityResult就收不到任何结果了。当他把singleTask模式改回标准模式,又恢复正常。

这个问题下面给出的答案中,有一位说startActivityForResult的文档中有这么一句话:

For example, if the activity you are launching uses the
singleTask launch mode, it will not run in your task and thus you
will immediately receive a cancel result.

意思是:比如说,如果你正加载的activity使用了singleTask的加载模式,它不会在你的栈中运行,而且这样你会马上收到一个取消的结果。

即在onActivityResult里马上得到一个RESULT_CANCEL.

他还补充说没有很好的补救方法。可以试试用监听广播的方法。

另一个stackoverflow的问题中,有人直接回答了不能再singleInstance或singleTop模式下使用startActivityForResult()方法,不仅被采纳了,票数还不低。

剩下的一个stackoverflow问题中,有人说把singleTask改成singleTop就会正常,得到高达59票并被采纳。实际上我用的就是singTop,可是onActivityResult还是无缘无故被调用了。


startActivityForResult的文档:

public void startActivityForResult (Intent intent, int
requestCode, Bundle options)

Added in API level 16

Launch an activity for which you would like a result when
it finished. When this activity exits, your onActivityResult() method will
be called with the given requestCode. Using a negative requestCode is the
same as calling startActivity(Intent) (the activity is not launched as a
sub-activity).

加载一个Activity,当它结束时你会得到结果。当这个Activty退出了,你的onActivityResult()方法会根据给出的requestCode被调用。使用一个负的requestCode和调用startActivity(intent)一样(activity不被加载成子activity)

Note that this method should only be used with Intent
protocols that are defined to return a result. In other protocols (such as
ACTION_MAIN or ACTION_VIEW), you may not get the result when you expect.
For example, if the activity you are launching uses the singleTask launch
mode, it will not run in your task and thus you will immediately receive a
cancel result.

注意这个方法只能用于被定义要返回结果的Intent协议。在其他协议中(譬如ACTION_MAIN或ACTION_VIEW),你可能在你想得到结果时得不到。比如,当你正载入的Activity使用的singleTask加载模式,它不会在你的栈中运行,这样你会立马得到一个取消的结果。

As a special case, if you call startActivityForResult()
with a requestCode >= 0 during the initial onCreate(Bundle
savedInstanceState)/onResume() of your activity, then your window will not
be displayed until a result is returned back from the started activity.
This is to avoid visible flickering when redirecting to another
activity.

有一个特例是,当你在初始的onCreate()方法或onResume()方法中用一个大于等于0的请求码调用startActivityForResult(),你的窗口在被启动的Activity返回结果前不会显示。这是为了避免跳转到另一Activity时可见的闪烁。

This method throws ActivityNotFoundException if there was
no Activity found to run the given Intent.

如果运行所给Intent的Activity没被找到,该方法会抛出ActivityNotFoundException异常。

【转自】http://freetymekiyan.1kapp.com/android-activity%E7%9A%84%E5%8A%A0%E8%BD%BD%E6%A8%A1%E5%BC%8F%E5%92%8Conactivityresult%E6%96%B9%E6%B3%95%E4%B9%8B%E9%97%B4%E7%9A%84%E5%86%B2%E7%AA%81/

时间: 2024-11-18 14:39:42

[转]Android Activity的加载模式和onActivityResult方法之间的冲突的相关文章

我的Android进阶之旅------>Android Activity的singleTask加载模式和onActivityResult方法之间的冲突

今天调试一个bug的时候,情景如下: 一个Activity A,需要用startActivityForResult方法开启Activity B.Activity B的launch mode被设置为singleTask,那么在Activity B开启之后的瞬间(未等B返回任何result),Activity A中的onActivityResult方法就会被调用,并且收到一个RESULT_CANCEL的request code. 然后在ActivityB中做了一些逻辑之后,在Activity B通过

Android四种Activity的加载模式(转)

建议首先阅读下面两篇文章,这样才可以更好的理解Activity的加载模式: Android的进程,线程模型: http://www.cnblogs.com/ghj1976/archive/2011/04/28/2031586.html 其中对“Android的单线程模型”的描述,明白Activity的一些注意事项. Android Application Task Activities的关系  http://www.cnblogs.com/ghj1976/archive/2011/04/29/2

Android学习笔记—第九章 Activity的加载模式

第九章 Activity的加载模式 task:类似于栈,每次打开界面会创建一个task,然后将这开启的界面放入到该task中. (1)standard:默认模式 每次都会创建一个新的界面,将该界面加入task中 (2)singleTop:栈顶单实例模式 a. 如果目标Activity不存在,创建一个新的Activity,存入到task中 b. 如果目标Activity已经存在,并且处于栈顶,不会再创建新的Activity c. 如果目标Activity已经存在,但不处于栈顶,创建一个新的Acti

Android Activity的加载的模式

---恢复内容开始--- 本文来自http://www.cnblogs.com/lwbqqyumidi/p/3771542.html launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里.这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task. Acti

Android中Activity四种加载模式

Activity四种加载模式 我们知道在配置Activity的时候可以指定android:lauchMode属性,该属性用于配置该Activity的加载模式,概述行支持以下四种: 1.standard: 标准模式,这是默认的加载模式. 2.singleTop: Task顶单例模式. 3.singleTask: Task内单例模式. 4.singleInstance: 全局单例模式. 那么Activity为什么需要制定加载模式呢? 由于在Android上启动一个应用后,系统会自动的创建一个属于该应

Activity的四种加载模式

Activity的加载模式是在清单文件AndroidManifest.xml文件中进行设置 <activity android:name="...." android:label="@string/app_name" android:launchMode="singleTask"(Activity的加载模式) android:theme="@android:style/Theme.Light.NoTitleBar" &g

Activity的四种加载模式(附:Intent标记位)

Activity的加载模式是在清单文件AndroidManifest.xml文件中进行设置 <activity android:name="...." android:label="@string/app_name" android:launchMode="singleTask"(Activity的加载模式) android:theme="@android:style/Theme.Light.NoTitleBar" &g

Activity的生命周期及加载模式

当Activity运行时,它的活动状态是由Android以栈的形式管理的,当前活动的Activity位于栈顶.并且Activity可以类似QQ的隐身,下线,上线等等,这就是它的生命周期. 1.Activity的生命周期 Activity的生命周期大致一共分为4种: 活动状态:位于前台,就是你能看的见 暂停状态:其他的Activity位于前台,该Activity依然可见,一般是部分可见,只是不能获得焦点. 停止状态:该Activity不可见,失去焦点. 销毁状态:该Activity结束.或者所在进

Activity的4种加载模式和Intent的常用flag

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity.可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity.这需要为Activity配置特定的加载模式,而不是使用默认的加载模式. 加载模式分类及在哪里配置 (1)Activity有四种加载模式: standard singleTop singleTask singleInstance (2)模式配置位置: 设置的位置在AndroidManifest.xml文