Android launchMode SingleTask newIntent 的问题

前置条件

  • 项目中,采用 MainActivity + 3个 fragment 的模式作为主要框架。MainActivity 使用 singleTask 模式启动。Fragment 采用 show/hide 方法进行显示和隐藏。
  • 给 H5 提供了接口,可以通过相关方法跳转到一些页面。
  • 其中有个方法是,前端通过 webView 调用相关原生方法跳转到 MainActivity 的第一个 Fragment
  • 原生的代码如下:

    Intent it = new Intent(activity, MainActivity.class);    
    it.putExtra("tabIndex", MainActivity.TAB_INDEX);
    activity.startActivity(it);
  • 因为 MainActivity 采用 SingleTask ,所以在 onNewIntent 方法中调用了 setIntent(intent) 方法,把新的 intent 传递给 MainActivity,这个时候通过 getIntent() 方法拿到的是新的 intent。

问题

  • 切换到第 3个 Fragment 页面,进入该 Fragment 的 activity ,然后点击 back 按键,这时候出现了诡异的情况,就是会跳转到第一个 Fragment ,而不是原路返回到进来的时候的第3个 Fragment ,通过打印 MainActivity 的 getIntent 中的 tabIndex 值如下:

    // 未调用跳转前的 intent 日志, tabIndex 一直为 null
    11-04 21:06:26.974 15703-15703/com.xxx D/MainActivity.java: [ (MainActivity.java:251)#onResume ] 当前 currentFragmentIndex:2, 传入的 tabIndex:null
    11-04 21:06:26.983 15703-15703/com.xxx D/MainActivity.java: [ (MainActivity.java:251)#onResume ] 当前 currentFragmentIndex:2, 传入的 tabIndex:null
    // 使用了原生跳转方法后的 intent 日志,可以看出来 tabIndex 有值了,证明把值传递给了 MainActivity 了
    11-04 21:06:30.144 15703-15703/com.xxx D/MainActivity.java: [ (MainActivity.java:251)#onResume ] 当前 currentFragmentIndex:2, 传入的 tabIndex:1
    11-04 21:06:30.238 15703-15703/com.xxx D/MainActivity.java: [ (MainActivity.java:251)#onResume ] 当前 currentFragmentIndex:1, 传入的 tabIndex:1
    //这是切换到第3个Fragment 页面的 activity 然后返回的 intent 日志,可以看到 tabIndex 还是上一个值,按说应该没有值的。
    11-04 21:06:34.214 15703-15703/com.xxx D/MainActivity.java: [ (MainActivity.java:251)#onResume ] 当前 currentFragmentIndex:2, 传入的 tabIndex:1
    11-04 21:06:34.237 15703-15703/com.xxx D/MainActivity.java: [ (MainActivity.java:251)#onResume ] 当前 currentFragmentIndex:2, 传入的 tabIndex:1

问题分析

  • 通过以上日志发现,在使用过跳转方法以后,就一直获取到的 tabIndex 都为1 ,经过谷歌和打印日志发现,因为我在第3个 Fragment 的 activity 返回到 MainActivity 和跳转到 MainActivity 走的生命周期方法不一样造成的。
    • 返回 MainActivity ,只走了 onResume 方法,这个时候拿到的 intent ,还是以前的 intent,所以 tabIndex 一直是上一个 intent 传递的值, 因为根本就没有走 onCreate 或者 onNewIntent 方法带来新的 intent。
    • 而走跳转到达 MainActivity 走的是 onNewIntent 方法,这个时候的 Intent 的是传递进来的最新的,所以 intent 中的 tabIndex 也是新的。

问题解决

  • 解决办法: 以前通过点击 back 或者直接调用 finish 方法的 activity 回到 MainActivity 的地方,全部调用 startActivity(new Intent(this,MainActivity.class)),这样就会走 onCreate 或者 onNewIntent 方法,这样拿到的 intent 永远是最新的。

转载于:https://www.cnblogs.com/liyiran/p/9905930.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值