SingleTask启动模式,Intent跳转获取不到Bundle携带的值

本文转自:https://www.jianshu.com/p/fe98ae8e3fb4

作者:Android平头哥

 

1.问题描述

今天碰到了一个问题,当一个Activity的启动模式为SingleTask的时候,Activity间进行跳转的时候,在该Activity的onCreate()方法里接收不到Bundle携带过来的值,通过这个小问题也让我明白了学习启动模式的重要性。

在解决这个问题之前,我们先来看一种情况,假设现在有ABCDE五个ActivIty,只有B的启动模式是singleTask,其余Activty是标准模式,Activity跳转的顺序是ABCDEAB,问现在栈中还有那几个Activity,知道singleTask原理的小伙伴们很容易知答案是A和B。

2.找原因

我们先来对比一下,standard标准模式和 singleTask 栈内复用模式:

1.如果ABCDE这五个Activity都是标准启动模式,那依次执行完跳转Activity:ABCDEAB,栈内的情况是这样的:

 

情形1

标准启动模式也是系统默认的启动模式,每启动一个Activity,都会重新创建一个实例,不管这个实例是否存在,并且我们知道任务栈是"先进后出的",所以先进栈的A位于栈底,最后一个Activity B位于栈顶。

2.当B Acticity的启动模式是singleTask 栈内复用模式时候,栈内的情况是这样的:

 

情形2(a)

因为B 的实例在栈内存在,所以再次启动的时候,就不会重新创建实例了,所以B 回到栈顶,并且B 上面的 实例会被移出栈,最终任务栈内的情况是这样的:

 

情形2(b)

回到我开头说的那个问题,启动一个 启动模式为 SingleTask 的Activity,为什么会在onCreate()方法里,拿不到Bundle传递的值?

原因也很简单,假设在任务栈中存在该Activity的实例,再次启动的时候,也就不会重新去创建它的实例,onCreate方法并没有执行,也就获取不到Bundle传递过来的值。此时,我们需要重写 onNewIntent()方法,系统会回调其onNewIntent方法,并将 onNewIntent 接收的 intent设置给 Activity。之后,我们可以在 onStart()方法中接收Bundle传递过来的值。

假设任务栈内不存在该Activity的实例,就会重新创建,其生命周期方法onCreate(),onStart(),onResume() 都会正常执行。

3.感悟

Activity作为四大组件之一,其重要性不言而喻,除了生命周期之外,它的启动模式也是一个重点和难点,找工作面试被问的概率还是很大,当然更重要的是,我们日常开发工作的时候,为了满足某些项目的特殊需求,就必须使用到Activity的启动模式,所以我们必须要掌握其四种启动模式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SingleTask启动模式的特点是,当一个Activity被设置为SingleTask模式时,系统会为该Activity创建一个新的任务栈,并且在这个任务栈中只会存在一个该Activity的实例。如果该Activity已经存在于任务栈中,系统会将该Activity之上的所有其他Activity都出栈,使得该Activity成为任务栈的栈顶。这意味着,当我们从其他应用或任务切换回SingleTask模式的Activity时,会保留该Activity所在的任务栈,不会重新创建新的实例。同时,该Activity的onCreate()方法也不会被调用,而是直接调用onNewIntent()方法来传递新的Intent。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Activity启动模式SingleTask](https://blog.csdn.net/wangxp423/article/details/83782545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Activity】Activity的启动模式SingleTask](https://blog.csdn.net/u011386173/article/details/88133730)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值