用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
移动端开发
›
Android Activity.FLAG.ACTIVITY_NEW_TASK是什么
Android Activity.FLAG.ACTIVITY_NEW_TASK是什么
用户国营
论坛元老
|
2024-10-10 16:44:42
|
显示全部楼层
|
阅读模式
楼主
主题
1609
|
帖子
1609
|
积分
4827
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
一、对话内容
Android启动模式,startActivity中的intent新增flag Activity.FLAG.ACTIVITY_NEW_TASK是否会对目标Activity的启动模式造成影响。 由于非Activity类型的context必要添加这个标志,假如目标activity是SingleTask/SingleTop/SingleInstance启动模式,是否会有影响呢?
Activity.FLAG.ACTIVITY_NEW_TASK 标志重要用于确保当从一个非 Activity 类型的 Context(例如,一个 Service 或 Application)启动 Activity 时,该 Activity 会被放置在一个新的使命(task)栈中。
然而,这个标志并不会直接改变目标 Activity 的启动模式(即 singleTask、singleTop、standard 或 singleInstance)。启动模式是在 AndroidManifest.xml 文件中为 <activity> 标签定义的,它决定了 Activity 如何与使命(task)中的其他 Activity 交互。
但 Activity.FLAG.ACTIVITY_NEW_TASK 与启动模式之间有一些交互作用:
singleTask
:假如目标 Activity 已经在当前使命栈中存在,并且它是该栈的根 Activity,那么系统会将这个 Activity 带到栈顶,而不是启动一个新的实例。但是,假如 Activity.FLAG.ACTIVITY_NEW_TASK 被设置,并且目标 Activity 不在当前使命栈中,系统会在一个新的使命栈中启动这个 Activity。
singleTop
:假如目标 Activity 已经在当前使命栈的栈顶,那么系统不会启动新的实例,而是复用现有的实例。但是,假如 Activity.FLAG.ACTIVITY_NEW_TASK 被设置,并且目标 Activity 不在当前使命栈中(或不在栈顶),系统会启动一个新的使命栈并将 Activity 放置在此中。
singleInstance
:在这种模式下,Activity 总是其本身的使命栈的根。这意味着无论 Activity.FLAG.ACTIVITY_NEW_TASK 是否被设置,该 Activity 都会在一个新的使命栈中启动。
standard
:在这种模式下,Activity 会被放置在启动它的 Activity 所在的使命栈中。但是,假如 Activity.FLAG.ACTIVITY_NEW_TASK 被设置,Activity 会在一个新的使命栈中启动。
总的来说,Activity.FLAG.ACTIVITY_NEW_TASK 会影响 Activity 被放置在哪个使命栈中,但它不会直接改变 Activity 的启动模式。目标 Activity 的启动模式仍然会按照 AndroidManifest.xml 中的定义来影响它与使命栈中其他 Activity 的交互。
使命栈里面除了activity,还包罗什么
在Android中,使命栈(Task)重要用于管理一个或多个Activity。传统上,使命栈里重要存放的是Activity实例,这些Activity按照它们被启动的次序依次分列在栈中。然而,除了Activity之外,使命栈本身并不直接包罗其他类型的组件(如Service、BroadcastReceiver、ContentProvider)。
但要注意的是,Activity可能与这些其他组件进行交互。例如,一个Activity可能会启动一个Service来处理后台使命,或者注册一个BroadcastReceiver来监听系统广播。然而,这些组件本身并不直接存储在使命栈中。
别的,使命栈的概念与Android应用的进程模型干系。一个应用可能包罗多个使命栈,每个使命栈都与用户执行的某项使命干系联。例如,用户可能在同一个应用中执行了多个不同的操作或流程,每个操作或流程都可能对应一个单独的使命栈。
总结来说,使命栈重要存放的是Activity实例,用于管理用户与应用之间的交互。而其他组件如Service、BroadcastReceiver等固然与Activity交互,但它们本身并不直接存储在使命栈中。
那非Activity的context启动别的一个activity,必须要添加Activity.FLAG.ACTIVITY_NEW_TASK来表明是新开一个栈,为什么还要
开发
手动添加如许一个flag,直接系统实现了不就好了么
非Activity的Context(如Service、Application等)启动Activity时要求添加Activity.FLAG_ACTIVITY_NEW_TASK标志的缘故原由与Android的设计哲学和用户体验有关。
起首,Android系统是基于使命和返回栈(Back Stack)的概念来管理用户与Activity之间的交互的。每个使命通常与一个或多个Activity干系联,并且这些Activity按照它们被启动的次序在返回栈中分列。当用户与Activity交互时(如点击按钮启动新Activity),这些Activity会被推入(push)到返回栈中。当用户按下后退按钮时,它们又会从栈中弹出(pop)并烧毁。
在标准的用户界面中,Activity通常是由另一个Activity启动的。在这种环境下,新启动的Activity会自然地被推入到启动它的Activity所在的使命栈中。然而,当非Activity的Context(如Service或Application)尝试启动Activity时,系统就面临一个寻衅:它不知道应该将这个Activity推入哪个使命栈,由于没有明确的“父”Activity来确定其归属。
为相识决这个问题,Android引入了Activity.FLAG_ACTIVITY_NEW_TASK标志。当这个标志被设置时,系统知道必要为这个Activity创建一个新的使命栈(假如它还不存在的话),并将这个Activity作为新栈的根Activity。这确保了Activity能够被正确地管理,并且用户可以通过标准的使命切换机制(如长按Home键或利用多使命按钮)来访问它。
至于为什么Android不直接为这种环境实现默认行为,这可能与机动性和控制性有关。通过要求
开发
者显式地设置这个标志,Android答应
开发
者更精致地控制Activity的启动和管理。
开发
者可以根据应用的具体需求和用户体验来决定是否创建新的使命栈,或者是否将Activity推入到现有的使命栈中。这种机动性使得Android应用能够适应各种复杂的场景和用例。
既然如此,那么添加了这个标志,假如是非activity的context来启动,无论如何,被启动的activity都是在一个新栈中,即便它之前是存在别的一个栈且是singleTask/singleTop启动模式?
当利用非Activity的Context(如Service或Application)启动一个Activity,并设置了Intent.FLAG_ACTIVITY_NEW_TASK标志时,确实会创建一个新的使命栈(假如该Activity不在当前任何使命栈中),并将这个Activity作为新栈的根。但关于singleTask和singleTop启动模式,我们必要进一步澄清。
singleTask
:
假如被启动的Activity已经在某个使命栈中存在,并且是栈根的Activity,那么系统会将它带到栈顶,并清空它之上的全部Activity。这是singleTask启动模式的根本行为。
但是,假如非Activity的Context启动了这个Activity,并且设置了Intent.FLAG_ACTIVITY_NEW_TASK,那么即使这个Activity已经在另一个使命栈中存在,系统也会在新的使命栈中启动它,而不是将它带到现有使命栈的栈顶。这是由于FLAG_ACTIVITY_NEW_TASK指示系统创建一个新使命(假如须要的话)。
singleTop
:
假如被启动的Activity已经在使命栈的栈顶,那么singleTop模式会阻止系统创建新的Activity实例,而是复用现有的实例。
但是,当利用非Activity的Context启动并设置了Intent.FLAG_ACTIVITY_NEW_TASK时,即使该Activity已经在另一个使命栈的栈顶,系统仍然会在新的使命栈中启动它。这是由于FLAG_ACTIVITY_NEW_TASK的优先级高于singleTop模式。
总结来说,当利用非Activity的Context启动Activity并设置了Intent.FLAG_ACTIVITY_NEW_TASK时,被启动的Activity会在新的使命栈中启动,即使它之前已经存在另一个使命栈中,且其启动模式是singleTask或singleTop。这是由于FLAG_ACTIVITY_NEW_TASK会强制创建新使命(假如必要的话)。假如盼望按照Activity的启动模式来管理使命栈,最好从现有的Activity启动该Activity,而不是从非Activity的Context启动。
在新的使命栈启动,是指将本来存在的Activity从别的一个栈移动到新的栈,还是值在新的栈新创建一个目标activity?
当利用非Activity的Context(如Service或Application)启动一个Activity,并设置了Intent.FLAG_ACTIVITY_NEW_TASK标志时,Android系统
不会
将本来存在于另一个使命栈中的Activity移动到新的使命栈。相反,它会在新的使命栈中
新创建一个
目标Activity的实例。
这是由于FLAG_ACTIVITY_NEW_TASK的重要目的是指示系统,假如须要的话,创建一个新的使命来容纳被启动的Activity。这与Activity的启动模式(如singleTask或singleTop)是分开处理的。启动模式决定了Activity如何与使命栈中的其他Activity交互,而FLAG_ACTIVITY_NEW_TASK则决定了Activity应该被放置在哪个使命栈中。
所以,即使目标Activity之前已经存在于另一个使命栈中,并且其启动模式是singleTask或singleTop,当利用非Activity的Context并设置FLAG_ACTIVITY_NEW_TASK来启动它时,Android系统仍然会在新的使命栈中创建一个新的Activity实例。这意味着用户将看到一个全新的Activity实例,而不是之前已经存在的谁人实例。
二、总结
activity启动目标activity时,有无该标志没有任何影响
非activity启动目标activity时,必须添加该标志
添加的作用:
告诉系统新开使命栈并将新建activity放入此中
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
用户国营
论坛元老
这个人很懒什么都没写!
楼主热帖
Beta 阶段事后分析
iOS全埋点解决方案-APP和H5打通 ...
Android studio实现网上订餐app
Ubuntu22.04+ROS2中实现Moveit2控制gaz ...
mysql主从搭建
完整版彻底卸载SQL Server2019
分布式锁
复杂「场景」数据导入导出
关键容灾技能比较
【云原生】-如何搭建配置Docker私有仓 ...
标签云
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表