前置条件

  • 项目中,采用 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 永远是最新的。

Android launchMode SingleTask newIntent 的问题的更多相关文章

  1. android:launchMode="singleTask" 与 onNewIntent(Intent intent) 的用法

    最近项目开发中用到了android:launchMode="singleTask" 和 onNewIntent(Intent intent)两个特性,现总结一下经验: androi ...

  2. android:launchMode的四种方式

    Activity一共有以下四种launchMode: standard singleTop singleTask singleInstance 1.standard standard模式是默认的启动模 ...

  3. Android LaunchMode案例篇

    首先感谢小伙伴的关注.然后祝愿广大的情侣们节日快乐! 在开发中有时会遇到这种场景,用户点击注冊.第一步,第二步,完毕注冊跳转到登录界面,不须要用户一步一步的返回到登录界面.这是怎么实现的呢? 案例:有 ...

  4. android launchmode(四种启动模式)应用场景及实例

    模式介绍 [1] standard 模式 这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中. [2] singleTop 模式 如果在任务的栈顶正好存在该Activ ...

  5. android:launchMode概述

    android:launchMode An instruction on how the activity should be launched. There are four modes that ...

  6. Android:singleTask + onActivityResult

    解决2个Activity互相跳转,并且栈中只保留每个Activity一个对象的存在. 在2个Activity中分别都要用到onActivityResult,所以就不能用launchMode=" ...

  7. Android之android:launchMode

    (本文转自:http://www.eoeandroid.com/blog-531377-3446.html) (详细查看:http://blog.csdn.net/liuhe688/article/d ...

  8. Activity的启动模式(android:launchMode)

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...

  9. 喜闻乐见-Android LaunchMode

    launchMode,通俗点说,就是定义了Activity应该如何被launch的.那么这几种模式的区别以及应用场景,会有何不同呢?谷歌是基于什么原因设计这几种模式的呢?这几种模式背后的工作原理是什么 ...

随机推荐

  1. 【Java】 剑指offer(52) 两个链表的第一个公共结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...

  2. PopupWindow分享页面

    效果图 步骤: 1.布局中添加分享按钮 2.画出分享页面 3.设置分享页面animator进出动画,并在style.xml中配置 4.MainActivity中添加方法 *画出布局 主页面: < ...

  3. python tkinter-按钮.标签.文本框、输入框

    按钮 无功能按钮 Button的text属性显示按钮上的文本 tkinter.Button(form, text='hello button').pack() 无论怎么变幻窗体大小,永远都在窗体的最上 ...

  4. Biquads

    From : http://www.earlevel.com/main/2003/02/28/biquads/     One of the most-used filter forms is the ...

  5. 使用MSF发现主机和端口扫描

    使用MSF发现主机和端口扫描 使用search命令查找需要的模块 MSF模块太多,记不住怎么办!!! 我们不需要记住所有模块,我们只要能找到我们想用的模块就行,平时积累使用的模块也行哦! 比如,我们通 ...

  6. npm和yarn

    在2016年10月11日facebook公开了新的javascript包管理工具yarn,用来替代目前被广泛使用的npm(nodejs 自带的包管理工具)

  7. C语言--isspace()函数实现

      c语言中有很多处理string类型的函数,今天简单的使用了一下isspace()函数,自我实现调用了一下. Isspace()函数   包含在ctype.h头文件中 函数原型: int isspa ...

  8. STL之heap与优先级队列Priority Queue详解

    一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的m ...

  9. Codeforces Round #407 div2 题解【ABCDE】

    Anastasia and pebbles 题意:你有两种框,每个框可以最多装k重量的物品,但是你每个框不能装不一样的物品.现在地面上有n个物品,问你最少多少次,可以把这n个物品全部装回去. 题解:其 ...

  10. STL——配接器、常用算法使用

    学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...