前言:网上说,使用startActivityForResult()进行数值回传时,onActivityResult()执行顺序在不同启动模式下有所差别。本人就对此进行了验证。
一.页面跳转使用的跳转方法
众所周知,Activity的跳转可以分为两类,分别是使用 startActivity()和startActivityForResult(),前者通常用于页面间正常的跳转,后者一般用于页面间传值(通过Intent)。onActivityResult()是在使用了startActivityForResult()才会调用。
二.onActivityResult()方法的使用(这里用MainActivity跳转到SecondActivity,demo是点击按钮btn跳转)
三.结果(以下说的launchMode是指SecondActivity清单文件的配置)
1.在android5.0及以上系统,onActivityResult()都是在SecondActivity按返回键或调用finish()以后才执行,下图是相关生命周期执行情况(四种launchMode都是这样的顺序);
2.但是,在5.0以下系统,
当launchMode设置为standard(默认的)和singletop模式时,同样操作执行的顺序跟图1相同。
当launchMode设置为singletask和singleinstance模式时,其执行顺序会跟图1不同(如下图2)。
四.总结
1.两个页面跳转数值回传时(即使用startActivityForResult())时,除特殊情况下,5.0以下系统目标Avcivity的启动模式(launchMode)影响onActivityResult()的执行顺序,源Avcivity无影响(本案例中SecondActivity是目标Avcivity,MainActivity是源Avcivity)。
2.在android5.0及以上系统时,onActivityResult()不受清单文件中启动模式影响,都是在SecondActivity按返回键或finish()以后执行。(如图1,有特殊情况,稍后补充)
3.在android5.0以下系统时,如果启动模式是standard(默认的)和singletop,onActivityResult()是在SecondActivity按返回键或finish()以后执行(如图1)。当启动模式是singletask和singleinstance时,onActivityResult()是在执行startActivityForResult()时立即执行(如图2)。
4.特殊情况:在android5.0及以上系统,当设置MainActivity中跳转使用的intent的flag为FLAG_ACTIVITY_NEW_TASK时,生命周期执行情况如图2.
五.原因
原因参考:https://stackoverflow.com/questions/8960072/onactivityresult-with-launchmode-singletask