Activity生命周期分析

本文深入剖析了Android中Activity的生命周期,包括返回栈的概念、活动状态、生存周期的不同阶段及其回调方法。此外,还探讨了在资源配置改变或内存不足时Activity的行为及如何处理这些问题。

前言

本文将从Activity生命周期涉及到的基本概念,如:返回栈,活动状态,活动的生存期以及异常情况下的生命周期分析等几个方面来分析。

目录

基本概念

1、返回栈
01 Android是使用任务来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈。
02 栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,
   它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()
   方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动会重新处于栈顶的位置。
   系统总是会显示处于栈顶的活动给用户。
复制代码
2、活动状态
每个活动在其生命周期中最多可以有4种状态:
01 运行状态
   活动位于返回栈的栈顶。
02 暂停状态
   活动不再位于返回栈栈顶,但依然可见。
03 停止状态
   活动不再位于栈顶位置,并且完全不可见。
04 销毁状态
   活动从返回栈中移除。
复制代码
3、活动的生存期
Activity中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
01 onCreate();活动第一次被创建的时候调用。
02 onStart();活动由不可见变为可见的时候调用。
03 onResume();活动准备好和用户进行交互的时候调用。活动位于返回栈栈顶。
04 onPause();在系统准备去启动或者恢复另一个活动的时候调用。
   可在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据。
   这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
   不能在onPause()中做重量级操作。
05 onStop();活动完全不可见的时候调用。
   它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,
   那么onPause()会得到执行,而onStop()并不会执行。
06 onDestroy();活动被销毁之前调用。
07 onRestart();活动由停止状态变为运行状态之前调用。

完整生存期:onCreate()--->onDestroy();
可见生存期:onStart()--->onStop();
前台生存期:onResume()--->onPause();
复制代码

异常情况下的生命周期分析

1、资源相关的系统配置发生改变导致Activity被杀死并重新创建
01 默认情况下,我们不对Activity做特殊处理的话,当系统配置发生改变后,
   Activity就会被销毁并重新创建。
复制代码

02 Activity在异常终止的情况下,会调用onSaveInstanceState()来保存
   当前Activity的状态(正常情况下系统不会回调这个方法)。
   当Activity被重新创建后,系统会调用onRestoreInstanceState(),
   并且把Activity销毁时onSaveInstanceState()保存的Bundle对象作为参数
   同时传递给onRestoreInstanceState()和onCreate()。
   从时序上来说,onSaveInstanceState()的调用时机是在onStop()之前,
   onPause()没有既定的时序关系。onRestoreInstanceState()调用时机
   是在onStart()之后。
03 例:旋转屏幕造成的Activity异常销毁
04 当系统配置发生改变后,Activity会被重新创建,有没有办法不重新创建呢?
   如果系统配置发生改变后,我们不想重新创建Activity,可以给Activity指定
   configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建,就可以
   给configChanges添加属性:
复制代码
   android:configChanges="keyboardHidden|orientation|screenSize"
复制代码
   此时系统会调用Activity的onConfigurationChanged(),我们就可以做一些我们自己的特殊处理了。
复制代码
@Override
public void onConfigurationChanged(Configuration newConfig){
    super(onConfigurationChanged(newConfig));
    Log.d(TAG,"onConfigurationChanged,newOrientation:"+newConfig.orientation);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        setContentView(R.layout.portrait_layout);
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.landscape_layout);
    }
}
复制代码
   优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
   缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
复制代码
如果你想更加完全的掌控监听屏幕旋转变化,可以结合OrientationEventListener,自定义旋转监听设置:
private OrientationEventListener mOrientationListener;

mOrientationListener = new OrientationEventListener(this) {
    @Override
    public void onOrientationChanged(int rotation) {
        if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation >= 135)&&(rotation <= 225))) {
            //portrait
            Log.d(TAG, "Screen orientation is Portrait!");
        } else if (((rotation > 45) && (rotation < 135))||((rotation > 225) && (rotation < 315))) {
            //landscape
            Log.d(TAG, "Screen orientation is Landscape!");
        }
    }
};
mOrientationListener.enable();
复制代码
2、资源内存不足导致低优先级的Activity被杀死
01 Activity的优先级情况:从高到低
  (1)前台Activity --- 正在和用户交互的Activity,优先级最高。
  (2)可见但非前台 --- 比如Activity中弹出了一个对话框,导致Activity可见
       但是位于后台无法和用户直接交互。
  (3)后台Activity --- 已经被暂停的Activity,比如执行了onStop,优先级最低。
   当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,
   并在后续通过onSaveInstanceState()和onRestoreInstanceState()来存储和恢复数据。
复制代码

转载于:https://juejin.im/post/5a9eaf2d518825558b3d700e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值