前置条件

  • 项目中,采用 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. 024 IDEA不能新建spring下的配置文件xml

    这个问题以前就遇到过,一直懒得解决,现在必须要用了,解决了一下,发现网上的解决方式果然不错. 1.现象 2.解决方式 需要添加一下spring context的依赖即可

  2. vscode下Python设置参考

    用于VS代码的Python扩展是高度可配置的.此页面介绍了可以使用的关键设置. 请参阅用户和工作区设置,以了解有关在VS代码中使用设置的更多信息. 常规设置 设置 默认 描述 python.pytho ...

  3. VSCode从非根目录编译golang程序(转)

    1.问题提出 “习惯在项目目录里建src放源码文件,根目录里放配置文件或者别的什么,在交付时直接忽视掉src目录就行了,但vscode好像不能这样愉快的玩耍...”??? 要实现把源码放到src目录下 ...

  4. 洛谷 [P1024]一元三次方程求解【二分答案】

    题目链接:https://www.luogu.org/problemnew/show/P1024 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b ...

  5. Linux学习之Vim/Vi使用(十三)

    Linux学习之Vim/Vi使用 Vim/Vi简介 Vim/Vi工作模式 Vim/Vi基本使用 Vim/Vi应用技巧 Vim/Vi简介 Vim/Vi是一个功能强大的全屏幕文本编辑器,是Linux/UN ...

  6. 为什么要使用getter/setter

    变量私有化的好处 1. 在setter中可以加入合法性检查,比如设置颜色的函数中,对于RGB颜色要判断其值在0~255之间. 2. 更新与被设置变量相关的其它变量的值,比如在一个潜水艇模拟系统中,改变 ...

  7. 码云,git使用 教程-便签

    码云,git使用 教程-便签 Code cloud, git use tutorial - note 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.c ...

  8. 宝塔Linux面板 5.1正式版永久免费

    宝塔Linux面板 5.1正式版永久免费2017/06/16 2分钟装好面板,一键管理服务器 Linux版请确保纯净系统安装(支持CentOS.Ubuntu.Debian.Fedora),Web端管理 ...

  9. mogodb排序

    db.getClloection('user').find().sort({'age':-1}).pretty() 2.自然排序,也就是插入的先后顺序 db.getClloection('user') ...

  10. 不让Editplus保存时java文件时生成.bak文件

    EditPlus是一个强大的编辑工具,不单单是编辑文字强大,很多的刚开始学习编程语言的初学者会选择它,例如 html,js,php,java.但是却遇到一个问题,就是每次编辑完后点保存就会出 现bak ...