前置条件

  • 项目中,采用 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. HTML页面滚动时获取离页面顶部的距离2种实现方法

    获取离滚动页面的顶部距离有两种方法一是DOM:而是jquery,具体的实现如下,感兴趣的朋友可以尝试操作下     方法一:DOM 复制代码 代码如下: <script> window.o ...

  2. 诡异的楼梯 HDU1180

    这题做了很久 做好了感觉很简单... 现在做题思路更加清晰了 一个要点就是   当楼梯过不去的时候不能是先过去时间加2  必须得回去等一秒   否则queue的时间顺序会被打破 #include< ...

  3. Linux学习之文本处理命令(五)

    ---恢复内容开始--- Linux 系统之文本处理命令 (一)基于关键字搜索 (二)基于列处理文本 (三)文本统计 (四)文本排序 (五)删除重复行 (六)文本比较 (七)处理文本内容 (八)搜索替 ...

  4. 漫谈可视化Prefuse(五)

    伴随着前期的基础积累,翻过API,读过一些Demo,总觉得自己已经摸透了Prefuse,小打小闹似乎已经无法满足内心膨胀的自己.还记得儿时看的<武状元苏乞儿>中降龙十八掌最后一张居然是空白 ...

  5. div+css布局记扎

    实际开发网站过程中边碰壁边积累了一些div+css布局相关的小技巧,在这里做一些整理与大家一起探讨.本文章将间歇性更新. 1.div+css布局综述 div+css布局个人观点就是“盒子套盒子”的关系 ...

  6. JavaScript函数使用技巧

    JavaScript中的函数是整个语言中最有趣的一部分,它们强大而且灵活.接下来,我们来讨论JavaScript中函数的一些常用技巧: 一.函数绑定 函数绑定是指创建一个函数,可以在特定的this环境 ...

  7. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  8. 潭州课堂25班:Ph201805201 第十四课 异常,处理 (课堂笔记)

    程序难免会出现错误 : 语法错误 : 逻辑错误: AttributeError  -->>  试图访问一个对象没有的属性, IOError  ---->>  输入输出异常 In ...

  9. flask之wtform与flask-session组件

    1.wtform from flask import Flask, render_template, request, redirect from wtforms import Form from w ...

  10. Sublime text 入门学习资源篇及其基本使用方法

    Sublime text 学习资源篇 史上最性感的编辑器-sublimetext,插件, 学习资源 官网 http://www.sublimetext.com/ 插件 https://packagec ...