美文网首页
Android中fragment调用onActivityResu

Android中fragment调用onActivityResu

作者: Van96 | 来源:发表于2016-12-14 13:37 被阅读653次

    更新:可先看此文章: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)

    相关文章

      网友评论

          本文标题:Android中fragment调用onActivityResu

          本文链接:https://www.haomeiwen.com/subject/mfsvsttx.html