onactivityresult啥时候执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了onactivityresult啥时候执行相关的知识,希望对你有一定的参考价值。

参考技术A 先在你的 activity 中 startActitivyForResult(myIntent);
等 这个 myIntent 对应的 activity 返回的时候就回到了你原来的 activity 中调用 onActivityResult() 了。

android 是通过这个办法调用另外一个 activity 并接收返回值的。你可以在 android.com 上了解它的介绍。本回答被提问者采纳
参考技术B 如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据

Android实战----调用startActivityForResult()后,onActivityResult()立即执行的问题

一、问题描述

遇到该问题两次了,决定在此记录,以观后效。问题现象就是题目中所说:调用startActivityForResult()后,onActivityResult()立即执行的问题


二、代码配置

Activity调用

 Intent intent = new Intent(activity,InvoiceActivity.class);
                intent.putExtra("storeId", order.getStoreId());
                activity.startActivityForResult(intent, 99);


InvoiceActivity返回

Intent intent = new Intent();
        intent.putExtra("orderInvoice", orderInvoice);
        setResult(100, intent);
        finish();


AndroidManifest.xml配置

<activity
            android:name="com.boce.cloud.settlement.InvoiceActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan|stateHidden" >
        </activity>


重要的就在于launchMode的配置中


三、问题原因

从柯元旦的《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,但返回键后,回退显示的是Activity X。 所以,即使在Activity执行setResult()函数,Activity2也是无法接收到的。

  由于这种现象的存在,所以android系统处于某种保护机制,发现将要跳转的Activity的启动模式是singleTask时,若需要执onActivityResult()函数则立即执行。这样就好理解多了

在ActivityA中,startActivityForResult到ActivityB,其中ActivityB设置为SingleTask。

那么在实际出现的现象为:

ActivityA的onActivityResult将会首先被回调,然后再执行ActivityB的onCreate函数,也就说无论ActivityB返回什么内容,在ActivityA中都不会被接收到。

所以在使用SingleTask的方法不要随便使用。



参考:http://www.cnblogs.com/cmgrass/p/5088265.html


四、解决

将launchMode改为默认,或不设置



以上是关于onactivityresult啥时候执行的主要内容,如果未能解决你的问题,请参考以下文章

OnActivityResult 方法已弃用,有啥替代方法?

android,,onActivityResult的作用是啥啊,requestCode, resultCode是啥意思啊?

fragment里层级套的太深没办法执行onactivityresult怎么办

片段 onActivityResult 方法执行调用活动 onActivityResult

onActivityResult执行两次问题

onActivityResult() 没有在 DialogFragment 中执行