一、对话内容
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企服之家,中国第一个企服评测及商务社交产业平台。 |