前置条件

  • 项目中,采用 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. Python contains

    一.__contains__ 判断字符串中是否包含相应的字符.

  2. BZOJ1845 [Cqoi2005] 三角形面积并 扫描线 计算几何

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1845 题意概括 给出n个三角形,求其面积并. 题解 有一个很经典的扫描线题目:矩形面积并.那个比较 ...

  3. 桌面版centos安装vncserver并在windows下使用VNC Viewer远程连接

    首先关闭防火墙 在Centos中安装vncserver yum install tigervnc-server 拷贝一份  /lib/systemd/system/vncserver@.service ...

  4. CPU个数、CPU核心数、CPU线程数

    CPU个数.CPU核心数.CPU线程数 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之 ...

  5. windows server 2003 安全加固(一)

    windows server 2003 安全加固 加固主要在如下方面 A 升级系统补丁 B NTFS权限合理设置 C 关闭不需要的服务 D 关闭不需要的端口 E 帐号和密码管理 F 开启安全策略 G ...

  6. BZOJ.4892.[TJOI2017]DNA(后缀自动机/后缀数组)

    题目链接 \(Description\) 给出两个串\(S,T\),求\(T\)在\(S\)中出现了多少次.出现是指.可以有\(3\)次(\(3\)个字符)不匹配(修改使其匹配). \(Solutio ...

  7. 潭州课堂25班:Ph201805201 爬虫基础 第六课 选择器 (课堂笔记)

    HTML解析库BeautifulSoup4 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间 ...

  8. 喵哈哈村的魔法考试 Round #12 (Div.2) 题解

    A 注意答案会超过int,考虑分l,r奇数和偶数来考虑即可. #include<bits/stdc++.h> using namespace std; long long l,r; int ...

  9. Java基础-多线程-③线程同步之synchronized

    使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...

  10. 关于SS的一点笔记

    过年的时候抽了点时间了解了下ss的协议.整理了一点笔记,一直没有时间发.今天发一下,免得忘了. SS的结构本身比较简单,他的基本结构如下: ss通常分为client和server两部分 client是 ...