FLAG_ACTIVITY_NEW_TASK使用场景及原理简析

FLAG_ACTIVITY_NEW_TASK使用场景及原理简析在非Activity(比如Service,BroadcastReceiver)中startActivity需要添加flagIntent.FLAG_ACTIVITY_NEW_TASK。否则会报Crash:android.util.AndroidRuntimeException:CallingstartActivity()fromoutsideofanActivitycontext…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在非Activity(比如Service,BroadcastReceiver)中startActivity需要添加flag Intent.FLAG_ACTIVITY_NEW_TASK。否则会报Crash:android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.

原文地址

以下Service为前提说明

简单来说:

每个Activity启动都需要依赖一个Task栈,在Service中启动Activity时一般使用ApplicationContext,它没自己的Task栈,(Activity有自己的栈,但Service中保存Activity实例容易造成内存泄漏)。

补充说明:

在MainActivity启动时,系统自动创建了App的Task栈,并且taskAffinity默认为包名:com.test.haha
以下为三种情况:

  • 情况1:只在Activity添加FLAG_ACTIVITY_NEW_TASK
    使用Task栈和MainActivity的Task栈是一样的,因为没有在AndroidMainfest添加taskAffinity,那么taskAffinity的默认值为包名即com.test.haha

  • 情况2:只在AndroidMainfest添加taskAffinity 不添加flag,无效

  • 情况3:同时在Activity添加FLAG_ACTIVITY_NEW_TASK 和 在AndroidMainfest添加taskAffinity(若指定为包名,则转到情况1)

    则创建新的Task栈,行为同启动模式singleTask。

可以使用adb shell dumpsys activity activities 或者 打印getTaskId()来验证。

请参考Google文档:任务和返回栈

注意: 当调用者需要从启动的Activity获取返回结果时,不能使用此标志。即使用startActivityForResult()要注意,没有返回值的。(见官网注释最后一句)

官网注释:

FLAG_ACTIVITY_NEW_TASK

If set, this activity will become the start of a new task on this history stack. A task (from the activity that started it to the next task activity) defines an atomic group of activities that the user can move to. Tasks can be moved to the foreground and background; all of the activities inside of a particular task always remain in the same order. See Tasks and Back Stack for more information about tasks.

This flag is generally used by activities that want to present a “launcher” style behavior: they give the user a list of separate things that can be done, which otherwise run completely independently of the activity launching them.

When using this flag, if a task is already running for the activity you are now starting, then a new activity will not be started; instead, the current task will simply be brought to the front of the screen with the state it was last in. See FLAG_ACTIVITY_MULTIPLE_TASK for a flag to disable this behavior.

This flag can not be used when the caller is requesting a result from the activity being launched.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185379.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月6日 上午10:46
下一篇 2022年10月6日 上午11:00


相关推荐

  • 百度云个人服务器搭建

    百度云个人服务器搭建百度云个人服务器搭建前言背景​ 前段时间看了一些文章,就突发奇想的想自己做一个小程序。于是乎有了需求,然后自然就去实现他了。因为没有搭建过自己的服务器,其中的过程也挺有意思的,所以就写下来,纪念纪念。大家也就图个乐呵看看,搭建的步骤仅供参考~~​ 至于为什么是百度云的服务器,咳咳,是因为刚刚好发现百度云在做活动,1000多的服务器只要300多,对于我这种穷屌丝来说,试试手,成本低一点当然很重…

    2022年5月9日
    54
  • MAC电脑用adb命令安装APK

    MAC电脑用adb命令安装APK目录开始过程结果开始分别在命令行里面输入以下命令:touch.bash_profileopen-e.bash_profilesource.bash_profileadbversion过程这个时候会弹出一个这种框需要你配置路径比如我的路径是这个命令:exportPATH=${PATH}:–…

    2022年6月1日
    90
  • Tortoise小乌龟SVN回滚到之前的提交版本,即如何撤销此次提交操作

    Tortoise小乌龟SVN回滚到之前的提交版本,即如何撤销此次提交操作

    2021年7月18日
    77
  • armv8处理器有哪些_arm是精简指令集

    armv8处理器有哪些_arm是精简指令集ARMv8是ARM版本升级以来最大的一次改变,ARMv8的架构继承以往ARMv7与之前处理器技术的基础,除了现有的16/32bit的Thumb2指令支持外,也向前兼容现有的A32(ARM32bit)指令集,扩充了基于64bit的AArch64架构,除了新增A64(ARM64bit)指令集外,也扩充了现有的A32(ARM32bit)和T32(Thumb232bit)指令集;ARMv8拥有两种…

    2022年10月16日
    5
  • phpstorm 2021.4 激活码_通用破解码

    phpstorm 2021.4 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    98
  • VBox虚拟机迁移

    VBox虚拟机迁移1 将虚拟机文件拷贝到新目录 2 再 VBox 中右键删除原有的虚拟机 弹出框中选移除 3 VBox 菜单控制 gt 注册 选中 1 中拷贝的目录 4 如果执行过 VBoxManagein 启动虚拟机时会提示 uuid 不匹配修改虚拟机目录下的以上两个文件中的 uuid 即可

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号