Android 试图尽最大可能保持它活动状态,杀死其它 Activity 来确保当前活动 Activity 有足够的资源可使用。 当另外一个 Activity 被激活,这个将会被暂停。...所以,在使用singleTask和FLAG_ACTIVITY_NEW_TASK时,要仔细测试应用程序。这也是官方文档上的建议。...也就是说,新activity成为新任务的根,旧的活动都被结束了。本flag只能与FLAG_ACTIVITY_NEW_TASK联合使用。...通过在启动图片浏览时设定这个标志,浏览及其它启动的 Activity 在下次用户返回 到 mail 程序时都将全部清除。...FLAG_ACTIVITY_MULTIPLE_TASK 不要使用这个标志,除非你自己实现了应用程序启动器。
系统用于恢复先前状态的已保存数据被称为“实例状态”,并且是 Bundle 对象中存储的键值对集合。 注意:每次用户旋转屏幕时,您的 Activity 将被销毁并重新创建。...默认情况下,系统会使用 Bundle 实例状态保存您的 Activity 布局(比如,输入到 EditText 对象中的文本值)中有关每个 View 对象的信息。...在我们退出应用程序时,必须把所有的任务栈中所有的activity清除出栈时,任务栈才会被销毁。当然任务栈也可以移动到后台, 并且保留了每一个activity的状态....启动标记 Intent Flag Intent.FLAG_ACTIVITY_NEW_TASK 该标志位表示使用一个新的Task来启动一个Activity,相当于在清单文件中给Activity指定“singleTask...Intent.FLAG_ACTIVITY_CLEAR_TOP 该标志位表示使用singleTask模式来启动一个Activity,与在清单文件指定android:launchMode="singleTask
当邮件发送之后,按下返回键仍然还是会回到你的应用程序当中,这让用户看起来好像刚才那个编写邮件的Activity就是你的应用程序当中的一部分。...,当用户按下返回键或者调用finish()方法时,系统会移除顶部Activity,让后面的Activity恢复活动状态。...在跨应用Intent传递时,如果系统中不存在singleTask Activity的实例,那么将创建一个新的Task,然后创建SingleTask Activity的实例,将其放入新的Task中。...1:假如目前有个任务栈T1中的情况是ABC,这个时候ActivityD以singleTask模式请求启动,其所需要的任务栈正是T1,则系统会直接创建D的实例并将其入栈到T1中。...在5.0之前,当启动一个Activity时,系统将首先检查Activity的launchMode,如果为A页面设置为SingleInstance或者B页面设置为singleTask或者singleInstance
一般Activity切换正常生命周期(这里的一般是指启动模式为standard,切换activity时没有加flag标志): ActivityA启动ActivityB: ActivityA 的生命周期onPause...时使用。...比如有电话进来(不属于用户的选择),它就不会被调用。 那么系统如何区分让当前activity退到background时使用是用户的选择?...affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task...默认情况,一个应用程序中的所有Activity都拥有相同的affinity。捏可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。
所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。...通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。...当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。...singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。...相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志,这个标志表示:如果这个activity已经启动了
大家好,又见面了,我是你们的朋友全栈君。 Android退出应用程序方法总结 在Android开发中,我们运行了应用程序后,都需要退出应用的,那么该如何退出应用,又都有哪些实现方式呢?...如果栈内有很多Activity 的话,使用该方法显得有点捉襟见肘了,没办法一次移出全部Activity,并且没有立即释放内存,活动的资源也没有被清理。 2....进程式 KillProcess(): 可以杀死当前应用活动的进程,这一操作将会把所有该进程内的资源(包括线程全部清理掉)。...当恢复一个Android应用程序时,会先从栈里面移除异常的Activity,相当于Back键操作。 3....,但是这些进程如果在将来某一时刻需要使用,便会重新启动。
Activity在内存不足被回收后怎样做可以恢复到销毁前状态?...当app被切回前台时,系统会恢复task和activity栈以及相应的intent和数据。 2.不要在Application类和全局单例类中存放数据,会导致app无法正确恢复状态。...SingleTask和taskAfiinity配合使用 Q:Activity的启动过程?...Fragment的显示要依赖于Activity,从Fragment的生命周期中就可以了解到。 Q:何时会考虑使用Fragment?...(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
) 掉 递归退出 就调用 finish() 方法 把当前的 Activity 退出 在打开新的 Activity 时使用 startActivityForResult , 然后自己加标志, 在 onActivityResult...使用 context 的时候, 小心内存泄露, 防止内存泄露 4.2 Context 是什么 它描述的是一个应用程序环境的信息,即上下文。...举例来说,这可能发生在,如果一个前台活动在一个对话框(其他进程的)运行之后仍然是可视的,比如输入法的弹出时。 寄宿着一个服务,该服务绑定到一个可视的活动。...一般地有很多后台进程运行着,因此它们保持在一个 LRU( least recently used ,即最近最少使用,如果您学过操作系统的话会觉得它很熟悉,跟内存的页面置换算法 LRU 一样)列表以确保最近使用最多的活动的进程最后被杀...他们在使用你的应用程序时,并不希望每次都要处理这个对话框。 因此,在程序里对响应性能的设计很重要,这样,系统不会显示 ANR 给用户。
启动的五种情况 ---- 启动 singleTask ( 栈内复用模式 ) 的 Activity 界面时 , 首先要处理任务栈 ( 3 种情况 ) , 然后处理任务栈中的实例 ( 2 种情况...Activity 实例 , 而是将该任务栈恢复到前台 ; ② 不存在 Activity 实例 : 创建新的 Activity 实例 , 放入新的任务栈中 ; 四、 singleTask 模式 存在 Activity..., 同时设置 FLAG_ACTIVITY_BROUGHT_TO_FRONT 标志位 , 清空除栈底根 Activity 之外的其它 Activity 实例 ; 新的 Intent 意图 : 本次启动界面将使用新的...Activity 的启动标志位了 ; 新的 Intent 意图 : 本次启动界面将使用新的 Activity 启动的 Intent ; 不设置 Intent 标志 : 该情况下 不设置 Activity...static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT 该标志位开发者不经常使用 , 一般情况下是在 栈顶复用模式 SingleTop 中由系统自动设置该标志位
使用场景:1、从A视图跳转到B视图,需要保存A视图的状态(不考虑特殊情况);2、屏幕从竖屏变为横屏,需要保存竖屏时的视图状态,从横屏变为竖屏亦然;3、当前Activity处于后台,系统因资源紧张将其杀死...onRestoreInstanceState : 恢复实例状态。使用场景:1、屏幕从竖屏变为横屏,横屏显示时需要恢复之前保存的竖屏状态;2、activity后台运行被系统杀死。...根据上面具体场景中各启动模式的处理日志,总结这些启动模式的异同点如下: 1、standard与singleTask的区别:只有待跳转的activity已有实例位于栈顶时,singleTask模式才需做特殊处理...设置启动标志时的生命周期 启动标志的概念 上面说的launchMode有个缺点,就是AndroidManifest.xml中对每个Activity只能指定唯一额一种启动模式,如果我们想在不同时候对同一个...该标志需要结合FLAG_ACTIVITY_NEW_TASK使用,即setFlags的参数为“Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
,当用户按下返回键或者调用finish()方法时,系统会移除顶部Activity,让后面的Activity恢复活动状态。...在跨应用Intent传递时,如果系统中不存在singleTask Activity的实例,那么将创建一个新的Task,然后创建SingleTask Activity的实例,将其放入新的Task中。...1:假如目前有个任务栈T1中的情况是ABC,这个时候ActivityD以singleTask模式请求启动,其所需要的任务栈正是T1,则系统会直接创建D的实例并将其入栈到T1中。 ?...singleTask1.png 2:假如DActivity启动所需要的任务栈为T2,由于T2和D的实例均不存在,那么系统会先创建任务栈T2,然后再创建D的实例并将其入栈到T2中。...,则会在LaunchFlags中加入FLAG_ACTIVITY_NEW_TASK标志,而如果含有FLAG_ACTIVITY_NEW_TASK标志的话,onActivityResult将会立即接收到一个cancle
有时候我们要进行一些跨应用的操作,比如拍照、P 图、分享到朋友圈,这一系列操作中会有多个应用的 Activity 互相调用,安卓系统是如何管理这些不同应用的 Activity 的呢?...答案你已经猜到了,就是使用 Task。 Task 是指在执行特定任务时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈中。...如果用户稍后通过选择开始任务的启动器图标来恢复任务,则该 Task 将出现在前台并恢复执行堆栈顶部的 Activity。 注意: 后台可以同时运行多个任务。...标志位 除了 AndroidManifest 文件以外,我们也可以在 startActivity() 时,为 Intent add flag 来改变 Activity 的状态: Intent intent...Task 关联的标志位: FLAG_ACTIVITY_NEW_TASK 和 singleTask 还是有一定区别的 如果 Activity 对应的 Task 已经存在就不会创建新的 Task,而是把旧的
关于保存和恢复View层次结构,系统的工作流程是:首先,Activity被意外终止时,Activity会调用onSaveInstanceState保存数据,然后,Activity会委托Window保存数据...(2)资源内存不足导致低优先级的Activity被杀死 Activity按照优先级从高到低依次为: 前台Activity 可见但非前台Activity 后台Activity 当系统内存不足时,系统会按照...解决方法:为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样在启动时就会为它创建一个新的任务栈,这时启动Activity实际上是以singleTask模式启动的。...SingleTask模式中的参数TaskAffinity TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义,TaskAffinity...如果调出的Activity只是一个功能片段,并没有实际的意义,也没有必要出现在长按Home键调出最近使用过的程序类表中,那么使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,所以历史
此外,实例可以是多个任务的成员,也可以是一个任务中的多个实例。 否。在发起意图的同一任务中打开 是 singleTop 否 与标准完全相同,但如果活动位于Task堆栈的顶部,则使用现有实例。 否。...recent first)即可 情景一: 就是如果应用启动默认的A,A再启动singleTask的B,B的taskAffinity设置了另一个任务栈,此时B再启动默认的C,是这样的 也就是singleTask...android:value="com.example.myfirstapp.MainActivity" /> 要在用户按下应用程序图标时向上导航...,可以使用NavUtils类的静态方法navigateUpFromSameTask()。...当您调用此方法时,它将完成当前活动并启动(或恢复)相应的父活动。如果目标父活动位于任务的后台堆栈中,则会将其提前。
用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行。...singleTask:栈内复用模式 这个模式有些特殊一点,我们先按使用情景介绍它,当我们将要启动该模式的activity时,系统会判断当前是否有它想要的任务栈: 没有它要的任务栈 系统会新创建一个任务,...taskAffinity 与 singleTask 了解到taskAffinity属性后我们在重新梳理一下singleTask启动模式。...清理任务 如果用户长时间离开任务,则系统会清除所有 Activity 的任务,根 Activity 除外。 当用户再次返回到任务时,仅恢复根 Activity。...clearTaskOnLaunch 如果在任务的根 Activity 中将此属性设置为 "true",则每当用户离开任务然后返回时,系统都会将堆栈清除到只剩下根 Activity。
搞懂这个生命周期的执行后就可以回答了,首先要知道面试官的意思:是要重新启动并恢复这个 Activity 还是说直接退出整个 app 如果要恢复则要在 onSaveInstanceState() 中进行保存数据并在...onRestoreInstanceState() 中进行恢复 如果是要退出 app 的话就要捕获全局的异常信息,并退出 app 当然个人建议是使用 UncaughtExceotionHandler...在该Activity的实例已经存在于Task和Back stack中(或者通俗的说可以通过按返回键返回到该Activity )时,当使用intent来再次启动该Activity的时候,如果此次启动不创建该...stack的栈顶. 5.启动模式的使用方式 优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以另外一种方式为准。...单纯使用 taskAffinity 不能导致 Activity 被创建在新的任务栈中,需要配合 singleTask 或者 singleInstance!
(PS:本篇文章的实验数据都基于Android7.0) Activity启动模式之Flags 先来看看常用Flags: Intent.FLAG_ACTIVITY_SINGLE_TOP 该标志位表示使用...Intent.FLAG_ACTIVITY_CLEAR_TOP 该标志位表示使用singleTask模式来启动一个Activity,与在清单文件指定android:launchMode="singleTask...Intent.FLAG_ACTIVITY_NEW_TASK 该标志位表示使用一个新的Task来启动一个Activity,相当于在清单文件中给Activity指定“singleTask”启动模式。...亲和关系确定两件事 - Activity 更改到的父项任务(请参阅 allowTaskReparenting 属性)和通过 FLAG_ACTIVITY_NEW_TASK 标志启动 Activity 时将用来容纳它的任务...一个应用程序不同Activity在不同任务中:当在应用程序中我们启动singleTask模式的Activity时会寻找与该Activity的taskAffinity相同的TASK当中启动,如果没有则会新建一个
可以观察到它设置了 action 和category 属性。 android.intent.action.MAIN 决定应用程序最先启动的Activity。...带参数的跳转 在跳转去下一个页面时,我们可能会想携带一些信息到下一个界面去。例如携带一些文本,数字等等。 或者是一个对象。 这些信息我们可以交给Intent,传递到下一个activity去。...谈一下返回栈 首先理解android是使用Task来管理活动,一个Task就是一组存放在栈里的活动的集合,这个栈就叫做返回栈,每启动一个新的活动,就会将其放入栈顶,当我们点击back回退或调用activity...onPause()方法:系统准备去启动或恢复另一个活动时调用。表示Activity正在停止,此时可做存储数据,停止动画等操作。 onStop()方法:在活动完全不可见的时候调用。...优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态? 优先级低的 Activity 在内存不足被回收后重新打开(横竖屏切换的过程中)会引发Activity重建。
Activity 活动跳转(Java&Kotlin) 任何正式APP都不可能只有一个Activity,当有多个Activity时,怎么从一个Activity进入到另一个Activity呢?...答案就是活动跳转。 ① 普通跳转 顾名思义,就是单纯从A到B,不带任何内容。...)); 如果把刚才Java里的代码复制到Kotlin里,会需要转译,转译后的Kotlin代码如下: Kotlin //活动跳转,从MainActivity跳转到TestActivity,普通跳转...Java //传递方 //活动跳转时传值 通过键值的方式传递 另一页面接收根据键来取值 Intent intent = new Intent(this,TestActivity.class...这样下次无论以何种方式启动该实例,也要走standard的完整流程 Intent.FLAG_ACTIVITY_CLEAR_TASK 该标志非常暴力,跳转到新页面时,栈中的原有实例都被情况,注意:该标志要结合
领取专属 10元无门槛券
手把手带您无忧上云