关于android:android-栈

4次阅读

共计 4547 个字符,预计需要花费 12 分钟才能阅读完成。

倡议首先浏览上面两篇文章,这样才能够更好的了解 Activity 的加载模式:
Android 的过程,线程模型
其中对“Android 的单线程模型”的形容,明确 Activity 的一些注意事项。
Android Application Task Activities 的关系
尤其要明确 Task 是啥。

一个 Activty 的生命周期

Activty 的生命周期的也就是它所在过程的生命周期。

每一个流动(Activity)都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由零碎来实现。

然而当一个流动的状态产生扭转的时候,开发者能够通过调用 onXX() 的办法获取到相干的告诉信息。

在实现 Activity 类的时候,通过笼罩(override)这些办法即可在你须要解决的时候来调用。

onCreate:当流动第一次启动的时候,触发该办法,能够在此时实现流动的初始化工作。
onCreate 办法有一个参数,该参数能够为空(null),也能够是之前调用 onSaveInstanceState()办法保留的状态信息。
onStart:该办法的触发示意所属流动将被展示给用户。
onResume:当一个流动和用户产生交互的时候,触发该办法。
onPause:当一个正在前台运行的流动因为其余的流动须要前台运行而转入后盾运行的时候,触发该办法。这时候须要将流动的状态长久化,比方正在编辑的数据库记录等。
onStop:当一个流动不再须要展现给用户的时候,触发该办法。如果内存缓和,零碎会间接完结这个流动,而不会触发 onStop 办法。所以保留状态信息是应该在 onPause 时做,而不是 onStop 时做。流动如果没有在前台运行,都将被进行或者 Linux 治理过程为了给新的流动预留足够的存储空间而随时完结这些流动。因而对于开发者来说,在设计应用程序的时候,必须时刻牢记这一准则。在一些状况下,onPause 办法或者是流动触发的最初的办法,因而开发者须要在这个时候保留须要保留的信息。
onRestart:当处于进行状态的流动须要再次展示给用户的时候,触发该办法。
onDestroy:当流动销毁的时候,触发该办法。和 onStop 办法一样,如果内存缓和,零碎会间接完结这个流动而不会触发该办法。
onSaveInstanceState:零碎调用该办法,容许流动保留之前的状态,比如说在一串字符串中的光标所处的地位等。
通常状况下,开发者不须要重写笼罩该办法,在默认的实现中,曾经提供了主动保留流动所波及到的用户界面组件的所有状态信息。
Activity 栈

下面提到开发者是无法控制 Activity 的状态的,那 Activity 的状态又是依照何种逻辑来运作的呢?这就要晓得 Activity 栈。

每个 Activity 的状态是由它在 Activity 栈(是一个后进先出 LIFO,蕴含所有正在运行 Activity 的队列)中的地位决定的。

当一个新的 Activity 启动时,以后的流动的 Activity 将会移到 Activity 栈的顶部。

如果用户应用后退按钮返回的话,或者前台的 Activity 完结,在栈上的 Activity 将会移上来并变为活动状态。如下图所示:


一个应用程序的优先级是受最高优先级的 Activity 影响的。当决定某个应用程序是否要终结去开释资源,Android 内存治理应用栈来决定基于 Activity 的应用程序的优先级。

Activity 状态

个别认为 Activity 有以下四种状态:

流动的:当一个 Activity 在栈顶,它是可视的、有焦点、可承受用户输出的。Android 试图尽最大可能放弃它活动状态,杀死其它 Activity 来确保以后流动 Activity 有足够的资源可应用。当另外一个 Activity 被激活,这个将会被暂停。

暂停:在很多状况下,你的 Activity 可视然而它没有焦点,换句话说它被暂停了。有可能起因是一个通明或者非全屏的 Activity 被激活。

当被暂停,一个 Activity 仍会当成活动状态,只不过是不能够承受用户输出。在极非凡的状况下,Android 将会杀死一个暂停的 Activity 来为流动的 Activity 提供短缺的资源。当一个 Activity 变为齐全暗藏,它将会变成进行。

进行:当一个 Activity 不是可视的,它“进行”了。这个 Activity 将依然在内存中保留它所有的状态和会员信息。尽管如此,当其它中央须要内存时,它将是最有可能被开释资源的。当一个 Activity 进行后,一个很重要的步骤是要保留数据和以后 UI 状态。一旦一个 Activity 退出或敞开了,它将变为待用状态。

待用:在一个 Activity 被杀死后和被装在前,它是待用状态的。待用 Acitivity 被移除 Activity 栈,并且须要在显示和可用之前重新启动它。

activity 的四种加载模式

在 android 的多 activity 开发中,activity 之间的跳转可能须要有多种形式,有时是一般的生成一个新实例,有时心愿跳转到原来某个 activity 实例,而不是生成大量的反复的 activity。加载模式便是决定以哪种形式启动一个跳转到原来某个 Activity 实例。

在 android 里,有 4 种 activity 的启动模式,别离为:

standard: 规范模式,一调用 startActivity()办法就会产生一个新的实例。
singleTop: 如果曾经有一个实例位于 Activity 栈的顶部时,就不产生新的实例,而只是调用 Activity 中的 newInstance()办法。如果不位于栈顶,会产生一个新的实例。
singleTask: 会在一个新的 task 中产生这个实例,当前每次调用都会应用这个,不会去产生新的实例了。
singleInstance: 这个跟 singleTask 基本上是一样,只有一个区别:在这个模式下的 Activity 实例所处的 task 中,只能有这个 activity 实例,不能有其余的实例。
这些启动模式能够在性能清单文件 AndroidManifest.xml 中进行设置,<activity> 中的 launchMode 属性。

相干的代码中也有一些标记能够应用, 比方咱们想只启用一个实例, 则能够应用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标记,这个标记示意:如果这个 activity 曾经启动了,就不产生新的 activity,而只是把这个 activity 实例加到栈顶来就能够了。

Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
intent.addFlags(Intent.FLAG\_ACTIVITY\_REORDER\_TO\_FRONT);
startActivity(intent);
Activity 的加载模式受启动 Activity 的 Intent 对象中设置的 Flag 和 manifest 文件中 Activity 的 <activity> 元素的个性值交互管制。

上面是影响加载模式的一些个性

外围的 Intent Flag 有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

外围的 <activity> 个性有:taskAffinity

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

四种加载模式的区别

所属 task 的区别
个别状况下,“standard”和”singleTop”的 activity 的指标 task,和收到的 Intent 的发送者在同一个 task 内,就相当于谁调用它,它就跟谁在同一个 Task 中。

除非 Intent 包含参数 FLAG_ACTIVITY_NEW_TASK。如果提供了 FLAG_ACTIVITY_NEW_TASK 参数,会启动到别的 task 里。

“singleTask”和”singleInstance”总是把要启动的 activity 作为一个 task 的根元素,他们不会被启动到一个其余 task 里。

是否容许多个实例
“standard”和”singleTop”能够被实例化屡次,并且是能够存在于不同的 task 中;这种实例化时一个 task 能够包含一个 activity 的多个实例;

“singleTask”和”singleInstance”则限度只生成一个实例,并且是 task 的根元素。

singleTop 要求如果创立 intent 的时候栈顶曾经有要创立的 Activity 的实例,则将 intent 发送给该实例,而不创立新的实例。

是否容许其它 activity 存在于本 task 内
“singleInstance”独占一个 task,其它 activity 不能存在那个 task 里;

如果它启动了一个新的 activity,不论新的 activity 的 launch mode 如何,新的 activity 都将会到别的 task 里运行(如同加了 FLAG_ACTIVITY_NEW_TASK 参数)。

而另外三种模式,则能够和其它 activity 共存。

是否每次都生成新实例
“standard”对于每一个启动 Intent 都会生成一个 activity 的新实例;

“singleTop”的 activity 如果在 task 的栈顶的话,则不生成新的该 activity 的实例,间接应用栈顶的实例,否则,生成该 activity 的实例。

比方:

当初 task 栈元素为 A -B-C-D(D 在栈顶),这时候给 D 发一个启动 intent,如果 D 是“standard”的,则生成 D 的一个新实例,栈变为 A-B-C-D-D。

如果 D 是 singleTop 的话,则不会生产 D 的新实例,栈状态仍为 A -B-C-D

如果这时候给 B 发 Intent 的话,不论 B 的 launchmode 是”standard”还是“singleTop”,都会生成 B 的新实例,栈状态变为 A -B-C-D-B。

“singleInstance”是其所在栈的惟一 activity,它会每次都被重用。

“singleTask”如果在栈顶,则承受 intent,否则,该 intent 会被抛弃,然而该 task 仍会回到前台。当曾经存在的 activity 实例解决新的 intent 时候,会调用 onNewIntent()办法,如果收到 intent 生成一个 activity 实例,那么用户能够通过 back 键回到上一个状态;如果是曾经存在的一个 activity 来解决这个 intent 的话,用户不能通过按 back 键返回到这之前的状态。

Android——Activity 栈,Android Task 工作栈,Android 下打印调用栈,Android 中的工作栈,android 的 task 工作栈,android java 打印调用栈,android java 调用栈,android python 全栈开发,android studio 查看以后栈,android studio 调用栈

本文转自 https://blog.51cto.com/u_1504…,如有侵权,请分割删除。

正文完
 0