总结:调用startActivityForResult,onActivityResult无响应的问题

人人都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数。

但你是否遭遇过onActivityResult()不执行或者未按预想的那样执行的情况呢?

这里我总结了三种情况:

1、执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了。
找了很久,终于通过小道消息得知,这与 Activity 的加载模式(launchMode)有关,该属性可以在
AndroidManifest.xml 中设置。
原先将其设为 singleInstance,经测试,所有需要传递或接收的 Activity
不允许设置该属性,或只能设为标准模式,否则系统将在 startActivityForResult() 后直接调用
onActivityResult()。

Note that this method should only be used with Intent
protocols
    
* that are defined to return a result.  In other
protocols (such as
    
* {@link Intent#ACTION_MAIN} or
{@link Intent#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.

2、两个activity传递数据和返回数据时,请求方的onActivityResult始终无响应,通过debug调试模式也没见调用该方法。查看了
各种配置和程序代码,均未发现有错误之处。后来仔细阅读API说明,恍然大悟,原来是调用startActivityForResult的参数问题,即调
用时这样:

startActivityForResult(intent, 0);
是第二个参数的问题,该参数必须大于0才能在返回值,并激活onActivityResult方法。
我最开始是用的一个activity默认的常量:RESULT_OK,跟踪了代码后发现,该常量的值为-1,当然没法激活
onActivityResult方法了,随后随便修改为一个大于0的整数,程序即通跑成功。
startActivityForResult(intent, 1); //这样就行了

API描述:
@requestCode If >= 0, this
code will be returned in  onActivityResult() when
the activity exits.

3、在TabHost的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题.

可以通过调用Activity的getCallingActivity()查看要接受数据的Activity。

API这么解释的:

Return the name of the activity that invoked this
activity.  This is
    
* who the data in {@link #setResult
setResult()} will be sent to.

举个列子,有两个ActivityA和B,A中执行startActivityForResult(1,new
Intent(A,B.class));

即由A调到B,再B执行setResult后执行getCallingActivity(),显示A。

解决办法如下:

1.通过父Activity启动其他Activity;

2.实现父Activity的onActivityResult方法,将该处接收到的请求转发给当前活动的子Activity;

3.自定义一个转发接口用来实现第2步中的转发功能;

4.子Activity中实现第3步接口中的方法用来接收返回信息;

代码如下:

1.通过父Activity启动其他Activity

1 getParent().startActivityForResult(new Intent(...), REQUEST_CODE);

2.实现父Activity的onActivityResult方法

按 Ctrl+C 复制代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 获取当前活动的Activity实例
Activity subActivity = getLocalActivityManager().getCurrentActivity();
//判断是否实现返回值接口
if (subActivity instanceof OnTabActivityResultListe<wbr>ner) {
//获取返回值接口实例
OnTabActivityResultListe<wbr>ner listener = (OnTabActivityResultListe<wbr>ner) subActivity;
//转发请求到子Activity
listener.onTabActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}

按 Ctrl+C 复制代码

3.自定义接口

public interface OnTabActivityResultListener {
    public void onTabActivityResult(int requestCode, int resultCode, Intent data);
}

4.子Activity需要实现onTabActivityResult方法

@Override
    public void onTabActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            //实现该处逻辑
        ...
        }
    }

总结:凡是Activity本身含有上次父类的情况都不能直接使用startActivityForResult,而要通过getParent(),通过父类调用此方法。

转载于:http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html

时间: 2024-10-15 23:13:47

总结:调用startActivityForResult,onActivityResult无响应的问题的相关文章

BUG系列:调用startActivityForResult()&amp;onActivityResult()无响应

前天遇到了一个麻烦,还真是麻烦啊! 我使用startActivityForResult()&onActivityResult(),由Activity-A 跳转到Activity-B 页面,然后在Activity-B页面编辑完个人资料之后携带个人数据交回到Activity-A页面:其实很简单的问题,但是 让我没有预料到的是竟然出现了岔子!下面展示我的效果图及正确的代码: 这些代码是作为编辑昵称:<Activity-B页面> public class EditToNickNameAty e

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

现象      今天在编写代码的时候,涉及到两个Activity通过Intent来传值的问题.具体描述为:activity A调用startActivityForResult()函数启动Activity B,然后B结束时通过setResult()函数将一些值回传给A.笔者过去使用这种方法很多次,屡试不爽.但是,今天居然出现了一个奇怪的现象,即从B跳回A后并没有按照预想的逻辑执行,通过抓Log发现,当从A启动B的时候,A中的onActivityResult()和onResume()函数均被执行.完

循环调用spring的dao,数个过后无响应

循环调用spring的dao,数个过后无响应 博客分类: spring daospringssh 最近遇到这么一个问题:前台按钮发送AJax请求到后台,后台是SSH框架.每点击一下按钮就发送一次请求. 点击数次(7次)过后,页面无ajax响应. 在排除前台因素之后,找 到后台代码.写一个Test类. public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationCo

Fragment中onActivityResult不响应

开发中遇到Fragment中onActivityResult不响应的问题,曾经见过. 不少同学说处理方法是在与Fragment绑定的FragmentActivity中重写onActivityResult方法.返回的result先传至Fragment的host FragmentActiivity.这个FragementActivity的onActivityResult函数必须调用 super.onActiivtyResult().super.onActiivtyResult会将未被处理的resul

关于v4包的Fragment过渡动画的事件监听无响应问题解决

项目中部分功能模块采用了单Activity+多Fragment模式,当Fragment切换时,需要在过渡动画执行完后做一些操作,通常就是在自己封装的FragmentBase中重写onCreateAnimation方法,创建一个Animation对象,并添加动画的事件监听.而最近升级了v4包后,突然发现添加的动画事件监听无响应了.通过查看源码,发现在v4包中关于Fragment管理类FragmentManagerImpl中,在获取Animation对象后,也添加了对动画的监听事件,也就覆盖了我自己

android:程序无响应,你该如何定位问题?

如果MainThread长时间无响应,系统会提示"XXX无响应",然后用户会关闭.那么,如何定位问题呢?无响应并不像Crash,它抓取不到异常日志,通常我们需要调试,才能定位问题.如何调试呢? 1.在Eclipse Devices窗口,选中app对应的包名,然后点击debug图标(绿色的小虫子),然后切换到Debug视图 2.切换视图之后,可以看到debug下,app的线程列表 3.对于main线程(第一个线程),选中,并将其挂起Suspend 4.然后我们就可以看到,Suspend之

【转】服务器无响应(或者本地MySQL服务器的套接字没有正确配置)的问题

服务器无响应(或者本地MySQL服务器的套接字没有正确配置)的问题 第一种情况:(深度清理垃圾导致host.MYD丢失) 跟很多网友一样!用wamp(或xampp.speedphp)可以很容易在自己的XP.Win7系统上快速搭建服务器环境,这样就可以本地测试漂        亮的Php+mysql网站了,启动wamp,浏览器打开http://localhost/phpmyadmin,能正常打开数据库……好,费话就到这里! 问题在这里:当我用“魔方”的‘深度清理垃圾’后,再次启动wamp,浏览器打

转 -android:程序无响应,你该如何定位问题?

如果MainThread长时间无响应,系统会提示“XXX无响应”,然后用户会关闭.那么,如何定位问题呢?无响应并不像Crash,它抓取不到异常日志,通常我们需要调试,才能定位问题.如何调试呢? 1.在Eclipse Devices窗口,选中app对应的包名,然后点击debug图标(绿色的小虫子),然后切换到Debug视图 2.切换视图之后,可以看到debug下,app的线程列表 3.对于main线程(第一个线程),选中,并将其挂起Suspend 4.然后我们就可以看到,Suspend之后,mai

ANR程序无响应原因及应对办法

Android ANR 分析解决方法 一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应 2. BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成 3. ServiceTimeout(20 seconds) --小概率类型 Servi