Activity知识梳理

Activity知识梳理

1. Activity生命周期

大部分Copy总结自这个博客官方

Activity是由Activity栈进管理,当启动一个新的Activity后,此Activity将被加入到Activity栈顶并处于运行状态,之前的Activity在栈中位于此Activity底部并且不会出现在前台除非新Activity退出。Acitivity一般意义上有四种状态:

  1. 当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于运行状态
  2. 当Activity失去了焦点但仍然对用于可见(如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕),此时处于暂停状态。这个状态的Activity仍然存活,当系统的内存极低的时候它会被杀死。
  3. 当Activity被其他Activity完全遮挡,此时此Activity对用户不可见,此时处于停止状态。这个时候它仍然保留着所有的状态和成员信息,然而,它对用户来说不再可见,所以它的窗口被隐藏,当需要在其他地方使用内存时,它常常被系统杀死。
  4. 当Activity由于人为或系统原因(如低内存等)被销毁,此时处于销毁状态;

官方图

2018091315368294235616.png

图中需要注意一下几点:

1.Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime

2.当执行onStart回调方法时,Activity开始被用户所见(也就是说,onCreate时用户是看不到此Activity的,那用户看到的是哪个?当然是此Activity之前的那个Activity),一直到onStop之前,此阶段Activity都是被用户可见,称之为visible lifetime

3.当执行到onResume回调方法时,Activity可以响应用户交互,一直到onPause方法之前,此阶段Activity称之为foreground lifetime

示例与QA

假设有两个Activity,A和B。

情况一 AB都不是透明的

启动A,开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。
此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

情况二 B不是透明的

启动A,开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。
当用户点击A中按钮来到B时,,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume 。
此时如果点击Back键,将依次执行B:onPause -> A:onResume -> B:onStop -> B:onDestroy。

情况三 在A已经位于栈顶的时候弹出Dialog

  1. 启动Dialog的主题是默认的。
    启动A,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。当在A是中弹出Dialog时,A的生命周期不会有任何变化。
  2. 启动Dialog的主题是Activity的。 待测

情况四 在A已经位于栈顶的时候弹出PopWindow

没任何影响

情况五 横竖屏切换时候的生命周期


此处必须设置screenSize的原文在这里

Q:onSaveInstanceState何时会调用?

只有在Activity异常终止的时候才会调用,也可以说是Activity即将被销毁并且有机会重新显示的情况下才会调用。

会触发的情况
  • Activity启动一个新的Activity的时候
  • Home键
  • Menu键
  • 锁屏
  • 用户旋转屏幕(API>13且没有设置orientation|screenSize)。
不会触发的情况
  • 用户按Back键不会触发,

onRestoreInstanceState不一定会和onSaveInstanceState成对出现。

Q:如何避免配置改变时Activity重建?

  • API<13设置configChanges=”orientation”或configChanges=”orientation|keyboardHidden”
  • API>13设置configChanges=”orientation|screenSize”

Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?

A: Activity被回收后可以在onCreate中的Bundle中判断是否有值来恢复数据。也可以在onRestoreInstanceState中恢复。

Q:说下Activity的四种启动模式?

(adb shell dumpsys activity 可以查看栈中的Activity)

  1. standard

    标准模式。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。谁启动了这个Activity,这个Activity就运行在它的那个任务栈中。

  2. singleTop

    栈顶复用模式。如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时会回调它的onNewIntent方法。

  3. singleTask

    栈内复用模式。只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,也会回调onNewIntent方法。比如Activity A,系统会首先寻找是否存在A想要的任务栈。如果不存在,就重新创建一个任务栈,然后创建A的实例后把A放入栈中。如果存在,看是否有A的实例在栈中存在。如果存在,系统会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。

    singleTask具有clearTop的效果。

  4. singleInstance

    单实例模式。具有singleTask的所有特性。具有此种模式的Activity只能单独地位于一个任务栈中。

Q:谈谈singleTop和singleTask的区别以及应用场景

singleTop
  • 处理通知
singleTask
  • 浏览器
  • 微信小程序

Q:onNewIntent()调用时机?

  • 启动一个SingleTop且位于栈顶的Activity的时候
  • 启动一个SingleTask且位于栈内的Activity的时候

Q:了解哪些Activity启动模式的标记位?

设定Activity启动模式的标记位
设定Activity运行状态的标记位

Q:如何启动其他应用的Activity?

用隐式意图启动Activity

Q:Activity的启动过程?

Reference