前言

前两天遇到了个onActivityResult执行时机错误的问题,在解决过程中学习了些onActivityResult与setResult的一些细节,记录一下。

问题

项目接入一个第三方sdk时,需要在一个webview的容器Activity A中调起登录Activity B,完成登录后,Activity B->setResult->finish。这时不是应该A的onActivityResult执行吗?可是却什么都没有发生。

解决

首先查看了B的setResult调用没有问题,然后又确认了启动模式也是 standard的没有问题。不过发现结束登录activity B后回到A后再按下back键,A的onActivityResult就执行了(A为webview的activity,activity栈里有多个实例)。感觉好像有点线索了,于是看第三方sdk的提供的activity,原来在它的activity中使用了一个static 的stack来自己管理activity栈,而启动B是在一个js接口回调提供给A的启动者的,这下就解决问题了。问题在与调用startactivityforresult的activity与B finish后的退回的activity不是一个对象,修改了activity栈相关的代码,bug果然解决了。

总结下onActivityResult执行错误常见原因

  • 待跳转的Activity启动模式错误: standard与singletop模式是会在跳转后的Activity finish后执行onActivityResult,而singletask和singleinstance模式是在startActivityforresult后立即执行onActivityResult;

  • startActivityforresult()的第二个参数requestCode必须>=0,而且<0xffff api文档里是这么说的:

@param requestCode If >= 0, this code will be returned in* onActivityResult() when the activity exits.

  • 在TabHost的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应: 这个问题主要还是和activitygroup有关,不过TabHost也是过时很久了,最好不要用。这个问题可以通过如下办法解决:

    • 通过父Activity启动其他Activity;

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

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

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

  • 调用startactivityforresult的activity与跳转的activity finish后返回的activity必须是同一个: 这就是我出现的bug,注意startactivityforresult的调用者不要错了。

我遇到的问题

  • activity设置了launchMode=“singleTask”
  • 删除解决