更新:可先看此文章:http://www.jianshu.com/p/7572097eccf1
今天在测试的时候,发现了一个问题:
概述:fragment调用startActivityForResult来启动新的Activity,发现fragment的onActivityResult被提前调用,并且在新的activity被finish掉以后没有回调fragment的onActivityResult方法,导致异常
理想情况:在一个fragment中使用了startActivityForResult()方法来启动一个新的Activity(就叫作Activity_1),在Activity_1中选择了数据项,再将结果带回到原来的fragment中,并显示出来。
BUG描述:1、(测试机,真机Android 4.3,API 18)在Activity_1选择完数据项后,并没有将新的数据显示到fragment中,而且使用Log发现,Activity_1被finish掉以后没有调用fragment的onActivityResult()
2、除此以外,我还注意到了一个很诡异的细节,在启动Activity_1之前,会调用一次fragment的onActivityResult()方法,在Activity_1被我手动finish()掉以后反而不会触发fragment的onActivityResult()方法
3、虚拟机(Nexus 5, API 23)不存在这个问题
问题所在:原来我在以前将Activity_1的启动方式设置为“singleTask”,导致了问题的发生。
原因:
在singleTask、singleInstance两个模式下,onActivityResult方法会立即调用,等到再setResult的时候,就不再起作用了
(from http://my.oschina.net/u/1463920/blog/307402)
讲道理,我更倾向于把这个问题归因为Android的一个BUG,因为在更高的API中,是不存在这个问题的,就是说后期Android的程序员将这个BUG修复了,所以这个BUG产生的原因我就不去深究了(其实我尝试过,但除了看到了stratActivity的一些流程以外别无所获)
解决办法:
1、将新开的Activity(即上文举例的Activity_1)的launchMode设为默认即可;
2、(未实际验证,但应该只适用于Activity )
正确的做法是,在A中监听方法onNewIntent(Intent intent),然后B或C返回A的方式应该是:
Intent intent = new Intent(B.this,A.class);
intent.putExtra("flag","1");
startActivty(intent);这样启动A的话,onNewIntent会被监听到,参数Intent就包含了 传递的数据,这里注意的是当调用onNewIntent()时,A中的UI组件已经加载完毕,更新UI的宽度高度等是没
有问题的。(from http://my.oschina.net/u/1463920/blog/307402)
网友评论