明修"栈"道——越过Android启动栈陷阱( 七 )


而deliverToCurrentTopIfNeeded()方法则如下图所示 。
 

明修"栈"道——越过Android启动栈陷阱

文章插图
 
mLaunchFlags和mLaunchMode , 无法满足条件 , 导致dontStart为false , 无缘
deliverNewIntent() 。
至此 , onNewIntent()的问题得到解答 。
五、结语通过一系列场景假设 , 我们发现了许多出乎意料的现象:
  1. 文档提到FLAG_ACTIVITY_NEW_TASK等价于singleTask , 与事实并不完全如此 , 只有与其他flag搭配才能达到相似的效果 。这一flag的注释非常片面 , 甚至会引发误解 , 单一因素无法决定整体表现 。
  2. 官方文档提到
    START_DELIVERED_TO_TOP会将新的Intent传递给顶层Activity , 但事实上 , 并不是每一种START_DELIVERED_TO_TOP都会把新的Intent重新分发 。
  3. 同一个栈底Activity , 前后两次都通过action或都通过setClassName跳转到时 , 第二次跳转竟然会失败 , 而两次用不同方式跳转时 , 则会成功 。
  4. 单纯使用FLAG_ACTIVITY_NEW_TASK时 , 跳栈底Activity和跳同栈内其他Activity的效果大相径庭 。
业务中遇到的问题 , 归根结底就是对Android栈机制不够了解造成的 。
在面对栈相关的编码时 , 开发者务必要想清楚 , 承担新开应用栈的Activty在应用全局承担怎样的使命 , 要对Task历史、flag属性、launchMode属性、Intent内容等全面评估 , 谨慎参考官方文档 , 才能避免栈陷阱 , 达成理想可靠的效果 。




推荐阅读