Activity易忽略的知识点

作者: Showdy | 来源:发表于2017-05-10 21:36 被阅读55次

Activity的生命周期

这里写图片描述

Activity的启动模式:

  • standard:标准模式.系统默认的启动模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在.谁启动了这Activity,那么这个Activity就运行在那个Activity所在的栈中.如果启动Activity时传入ApplicationContext会报错,因为非Activity类型Context并没有所谓的栈,解决这个问题需要给待启动Activity设置FLAG_ACTIVITY_NEW_TASK标记位,相当于以singleTask模式启动.

  • singleTop: 栈顶复用模式.如果新Activity已经为栈顶,那么Activity不会被重新创建,同时onNewIntent()会被调用,但是Activity的onCreate()和onStart()不会被调用;如果新的Activity存在但是不在栈顶,那么Activity仍然会重新创建.

  • singleTask: 栈内复用模式.只要Activity在一个栈中存在,多次启动Activity都不会重新创建实例,和singleTop一样,系统会调用onNewIntent().但是singleTask模式具有clearTop的效果,会导致栈内待启动Activity上面的Activity被出栈.

  • singleInstance: 单例模式.singleInstance是一种加强版的singleTask模式,具有此启动模式Activity单独存在一个栈内复用.

启动模式应用场景:

  • 假如目前有2个任务栈,前台任务栈有12,而后台任务栈有XY,假设CD的启动模式均为singleTask,那么启动Y时,整个后台任务栈都会被切换到前台,这时后退列表就变为12XY,当点击back键时,列表中Activity会一一出栈.
这里写图片描述
  • 但是启动的不是Y而是X,情况就不一样了.
这里写图片描述

任务相关性

  • TaskAffinity: 任务相关性.

    这个参数标识一个Activity所需要的任务栈的名称,默认情况为应用包名.当然,可以为每个Activity指单独的TaskAffinity属性,属性名需和包名不同,否则没有意义.TaskAffinity属性主要和singleTask启动模式以及allowTaskReparenting属性配对使用,其他情况没有意义.另外任务栈分为前台任务栈和后台任务栈,后台任务栈中所有Activity处于暂停状态.

    当TaskAffinity与singleTask启动模式使用时, 他具有该模式Activity目前任务栈的名称,待启动的Activity会运行在名字和TaskAffinity相同的任务栈.

    当TaskAffinity与allowTaskReparenting结合使用时,情况比较复杂,会产生特殊的效果.

清理任务栈

如果用户长时间离开任务,则系统会清除所有 Activity 的任务,根 Activity 除外。 当用户再次返回到任务时,仅恢复根 Activity。系统这样做的原因是,经过很长一段时间后,用户可能已经放弃之前执行的操作,返回到任务是要开始执行新的操作。可以使用下列几个 Activity 属性修改此行为:

  • alwaysRetainTaskState

    如果在任务的根 Activity 中将此属性设置为 "true",则不会发生刚才所述的默认行为。即使在很长一段时间后,任务仍将所有 Activity 保留在其堆栈中。

  • clearTaskOnLaunch

    如果在任务的根 Activity 中将此属性设置为 "true",则每当用户离开任务然后返回时,系统都会将堆栈清除到只剩下根 Activity。 换而言之,它与 alwaysRetainTaskState 正好相反。 即使只离开任务片刻时间,用户也始终会返回到任务的初始状态。

  • finishOnTaskLaunch

    此属性类似于 clearTaskOnLaunch,但它对单个 Activity 起作用,而非整个任务。 此外,它还有可能会导致任何 Activity 停止,包括根 Activity。 设置为 "true" 时,Activity 仍是任务的一部分,但是仅限于当前会话。如果用户离开然后返回任务,则任务将不复存在。

Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK:

    该标记的作用是为Activity指定"singleTask"启动模式,效果和XML中指定一样. service中启动activity需要用到此标记.

  • FLAG_ACTIVITY_SINGLE_TOP:

    该标记的作用是为Activity指定"singleTop"启动模式,效果和XML中指定一样.

  • FLAG_ACTIVITY_CLEAR_TOP:

    具有此标记的Activity,当启动时,在同一个任务栈中所有位于他上面的Activity都要被清除出栈,此标记一般与singleTask启动模式一起使用.在这种情况下,若被启动Activity的实例已经存在,那么系统会调用onNewIntent.如果被启动Activity采用的standard模式,那么连同他之上的activity都要出栈,系统会创建新的activity实例放入栈顶.

参考

相关文章

网友评论

    本文标题:Activity易忽略的知识点

    本文链接:https://www.haomeiwen.com/subject/kdqntxtx.html