参考 《第一行代码》第二版
返回栈
Android 中的 Activity 调用也是使用栈来存储,即当启动一个新的 Activity 时,这个 Activity 就会入栈到栈顶,如果栈顶的 Activity 被销毁了,前面一个 Activity 就会显示到栈顶(即手机屏幕正在展示的界面对应的 Activity),所以系统总是会显示栈顶的的活动给用户,这个用来存储活动的栈称为返回栈
活动状态
每一个 Activity 都有以下几种状态
- 运行状态
- 在返回栈中处于栈顶位置的 Activity 所对应的状态就是运行状态
- 对于运行状态的 Activity,系统一般是不会去回收的
- 暂停状态
- 当一个 Activity 不是在返回栈的栈顶位置,但是该 Activity 仍然处于可见状态时对应的状态就是暂停状态
- 为什么 Activity 不是在返回栈的栈顶还可见呢?因为在 Android 系统中是可以让 Activity 只占用部分屏幕区域的,那么当前 Activity 未占用的屏幕区域对于用户来说还是可见的
- 对于暂停状态的 Activity 系统只有在内存极低的情况下才考虑去回收对应的内存
- 停止状态
- 当一个 Activity 不是在返回栈的栈顶,同时也是不可见的时候就是停止状态
- 当内存不够的时候,停止状态的活动是有可能被回收的
- 销毁状态
- 当一个活动从返回栈中被移除了就变成了销毁状态
Activity生命周期对应的方法
onCreate方法
- 在活动第一次被创建的时候会被调用
- 应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等
onStart方法
该方法在活动由不可见变成可见的时候被调用
onResume方法
这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态
onPause方法
- 系统准备去启动或者恢复另一个活动的时候调用
- 通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据
- 这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用
- 调用 onPause 而没有调用 onStop 方法进入的是 暂停状态而不是停止状态,那么当重新回到这个 Activity 的时候只会调用 onResume 方法,不会调用 onRestart 和 onStart 方法
onStop方法
- 该方法在活动完全不可见的时候调用
- 该方法和 onPause() 方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause() 方法会得到执行,而 onStop() 方法并不会执行(因为 Activity 还是可见的)
- 如果调用了 onStop 方法则说明一定是进入了停止状态,反过来说 Activity 进入停止状态的时候一定会调用 onStop 方法
- 如果调用了 onStop 方法,那么当重新回到这个 Activity 的时候一定会调用 onRestart,onStart,onResume 方法
onDestroy方法
- 这个方法在活动被销毁之前调用
- 该调用之后活动的状态将变为销毁状态
onRestart方法
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了
停止状态的活动被回收怎么解决
停止状态就是对应的 Activity 不是在返回栈的栈顶,同时对应的 Activity 完全不可见,对于这种状态的 Activity 系统在内存不足的时候是可能会回收的,此时可能会造成一些不好的用户体验,因为在之前的 Activity 中可能存在一些临时数据,当这个 Activity 被回收之后,点击返回按钮虽然也可以重新创建这个 Activity,但是对应的临时数据是不存在了,所以需要其他的方法来保存对应的数据
onSaveInstanceState方法
- 可以通过重写
protected void onSaveInstanceState(@NonNull Bundle outState)方法,该方法在活动被回收之前会被回调到,所以可以重写该方法,然后将数据保存在 Bundle 中,Bundle 中提供了一系列的 put 方法来保存数据 - 每一个 Activity 的 onCreate 方法其实也是有一个 Bundle 类型的参数的,
protected void onCreate(Bundle savedInstanceState)这个参数一般是 null,但是如果有在 onSaveInstanceState 方法中将数据保存在 Bundle 中,当再次创建 Activity 的时候该参数就是有值的