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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 编译器警告RegisterStartupScript已经过时

    编译器警告RegisterStartupScript已经过时protectedvoidAlertMsg(stringmsg){this.Page.RegisterStartupScript(“alert”,”<scriptlanguage=\”javascript\”>alert(‘”+msg+”‘);</script>”);}使用上面的代码建立的客户端脚本块编译器会警告Reg…

    2022年7月20日
    10
  • Spring的基本配置和Spring与Mybatis的整合

    Spring的基本配置和Spring与Mybatis的整合Spring:        Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopmentandDesign中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪…

    2022年4月29日
    37
  • Android代码混淆技术总结(一)「建议收藏」

    Android代码混淆技术总结(一)「建议收藏」*作者:ix__xi,本文转载自安全客,原文地址:http://bobao.360.cn/learning/detail/3704.html一、前言最近一直在学习Android加固方面的知识,看了不少论文、技术博客以及一些github上的源代码,下面总结一下混淆方面的技术,也算是给想学习加固的同学做一些科普,在文中讲到的论文、资料以及源码,我都会给出相应的链接,供大家进一步

    2022年5月27日
    41
  • leetcode-103二叉树的锯齿形层序遍历「建议收藏」

    leetcode-103二叉树的锯齿形层序遍历「建议收藏」给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层序遍历如下:[ [3], [20,9], [15,7]]/** * Definition for a binary tree node. * struct TreeNode { * int

    2022年8月8日
    2
  • c语言飞机订票系统设计,飞机订票系统设计「建议收藏」

    c语言飞机订票系统设计,飞机订票系统设计「建议收藏」该楼层疑似违规已被系统折叠隐藏此楼查看此楼u=find_num_hlink_list(save,book_flight_num);strcpy(ticket_x1.flight_num,u->info.flight_num);strcpy(ticket_x1.start_add,u->info.start_add);strcpy(ticket_x1.end_add,u->inf…

    2022年6月16日
    26
  • DirectX修复工具的详细使用步骤介绍[通俗易懂]

    DirectX修复工具的详细使用步骤介绍[通俗易懂]DirectX修复工具的详细使用步骤介绍@TOCDirectX修复工具是一款系统级工具软件,简便易用,无需安装,可直接运行,下面为大家分享的是DirectX修复工具的详细使用步骤介绍首先我们下载DirectX修复工具,再找到并打开“维护电脑”,在找到并打开“恢复软件”,再点“DirectX修复工具”2.这时候解压之后,这里有两个DirectXRepair.exe修复工具,另一个Direc…

    2022年6月10日
    43

发表回复

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

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