问题:
今天在修复项目bug时,需要通过Intent 来传值控制主Activity tab切换,但是在返回MainActivity时,发现收不到intent传递到数据,
然后检查一下代码,发现传递的Key和获取的Key都没错,但是为什么在目标Activity会获取不到传递过来的数据?
然后查资料,发现是Activity的启动模式导致的,MainActivity 设置的启动模式是 singleTask ,
也就是说,如果目标Activity的实例已经存在并且符合要求,则不会再创建相应的实例,因此在Activity的4种启动模式中,以singleTop(有可能)、singleTask、singleInstance模式启动的目标Activity,当置于后台被再次启动时都会导致目标Activity获取不到传递过来的数据(这里指的获取不到是指在不借助其它操作时)。
更通俗来讲就是,这时候通过 getInten() 方法获取到的 intent 是已启动的 activity 的原始 intent,也就是说 intent 的数据没有更新,这样在已启动的 activity 里拿到的 intent 的数据是旧数据。
解决方法:
知道原因之后,那么该如何解决这个问题呢?其实谷歌早就考虑到了这种问题,于是在Androidapi中的Activity类中给我们提供了一个叫onNewIntent的方法来解决这个问题:
如果要每次获取 intent 传来的新数据就需要在 onNewIntent(Intent intent) 方法里调用setIntent(intent)设置这个传来的最新的 intent。
即在启动模式为 singleTask 的 activity 里加上以下代码,然后通过 getIntent() 就可以获取到新传递过来的值了。
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//must store the new intent unless getIntent() will return the old one processExtraData();
}
参考:
链接:https://www.jianshu.com/p/ad13bebc82ab
链接:https://www.jianshu.com/p/e0244db7e33f