Android之Activity生命周期

本文详细介绍了Android活动中正常和异常情况下的生命周期,包括onStart、onResume、onPause、onStop、onDestroy的调用顺序及应用场景。特别讨论了屏幕旋转时如何避免Activity重建,以及onSaveInstanceState和onRestoreInstanceState在配置变更时的角色。同时,解释了Activity的configChanges属性如何影响屏幕旋转时的生命周期,并展示了如何处理屏幕方向改变。

Android之生命周期

前言

Android的生命周期算是安卓入门必要了解的东西,相信下面的生命周期图大家已经见过很多次了,具体每个方法是什么,就不细细的说了,挑着重点说一说.
在这里插入图片描述
注: 此图摘录Android开发艺术探索

1. Android的生命周期

按我的理解来说, onStart和onResume, onPause和onStop的区别如下:
onStart和onStop代表这个活动是否可见,而onResume和onPause代表这个这个活动是否可以与用户交互.

1.1正常情况下的生命周期

上图为正常情况下的生命周期,大致分为以下几种情况:

  1. 在刚打开一个活动时,它的生命周期为
    在这里插入图片描述
  2. 在正常按下返回键之后,它的生命周期为onPause()------>onStop()------->onDestory()
    在这里插入图片描述
  3. 如果进入一个活动后,通过按Home键的方式把程序放到后台,它的生命周期为onPause()------>onStop(),如果从后台再次打开,它的生命周期为---->onRestart()—>onStart()—>onResume().
    在这里插入图片描述
  4. 当你进入一个活动后直接杀进程它的生命周期为onPause()------>onStop()-------->onDestory(),一般活动回调onDestory的条件是该Activity被弹出的任务栈.
    在这里插入图片描述
    其中onPause()------>onStop()这两个方法的调用时机是在杀进程前(在程序进入后台时回调)
  5. 在Activity的生命周期中,onPause方法的执行不要消耗太长的时间
    原因如下:
    当Activity1启动了Activity2时,它们的生命周期输出如下:
    在这里插入图片描述
    Activity2会在Activity1的onPause方法执行完才会执行Activity2的oncreate方法,等Activity2可以与用户交互了Activity1才会执行它的onStop方法.
    如果在Activity2通过返回键返回Activity1,同样的道理,不可以在Activity2中的onPause2方法中花费太长的时间,因为当我们返回后,生命周期如下:
    在这里插入图片描述

所以如果在onPause方法中执行的程序太浪费时间,我们活动的跳转就会发生卡顿.非常影响用户的体验

  1. 当我们启动了Activity1,然后通过Activity1,启动了Activity2,这时直接杀进程,会从任务栈中依次走完每个活动的生命周期.
    在这里插入图片描述
1.2异常情况下的生命周期-----onSaveInstanceState(Bundle outState)方法和onRestoreInstance(Bundle savedInstanceState)方法

上面分析了正常情况下的生命周期, 下面说一说异常情况下的,异常情况下一般有两种情况

  1. 资源相关的系统配置导致活动被杀死
  2. 系统内存不足导致系统资源被杀死

关于onSaveInstanceState和onRestoreInstanceState这两个方法的调用时机
onSaveInstanceState的调用时机:

  1. 操作后,Activity还在任务栈中,这时就会调用onSaveInstanceState方法,(比如startActivity了另一个活动或者按下home键)
  2. 导致出栈的操作不会调用该方法,比如按下了back键位或者执行了该活动的finish()方法.

onRestoreInstanceState方法的调用时机:

  1. 更换资源时,比如更换字体或者字体大小的时候
  2. 旋转屏幕的时候
  3. 当系统内存不足的时候,会优先杀死在后台运行的活动的所在进程,如果该进程被杀死了,用户同过后台再次进入APP,那么这时目标活动机会调用此方法来恢复数据

当没有OverRide这两个方法时,其实安卓会自动的帮助Activity保存和恢复数据,比如在用户在文本框中输入的文字,ListView的进度条等等.当你旋转屏幕时,虽然完成了活动的销毁与重建,但你会发现这些数据都在.

onSaveInstanceState在onStop()方法执行后调用,onRestoreInstanceState()方法在onStart()方法之后调用

总之,onSaveInstanceState(Bundle outState)方法的本质是往Bundle对象中存储数据,而onRestoreInstanceState(Bundle saveInstanceState)方法是使用Bundle对象中的数据.一般onCreate方法和onRestoreInstanceState方法都会得到这个Bundle对象,但是谷歌更加建议使用onRestoreInstanceState,因为只要onRestoreInstanceState被回调,Bundle实例必然不为null,而onCreate方法就不一定了,需要对这个Bundle对象做一个是否为null的判断.

在Android开发中,如果一个进程中没有四大组件在运行,那么这个进程极容易被回收,所以一些后台工作(非主线程中的操作),最好放在Service中进行,这样可以让进程有一些优先级,从而不被杀死.

1.3 Activity的 configChanges属性

从上面的内容可以知道,旋转屏幕时活动的生命周期会先onDestory然后重新onCreate. Android中也提供了制止这种recreate行为的操作. 需要在AndroidMainFest文件中给Activity标签内添加以下属性.

 android:configChanges="orientation|screenSize">

orientation|screenSize被设施后,旋转屏幕后,活动也不会再recreate,并且onSaveInstanceState和onRestoreInstanceState方法将不会被系统回调,取而代之的是调用了onConfigurationChanged方法,并且可以通过该方法的参数去得到当前屏幕是横屏还是竖屏.

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.d("t", "onConfigurationChanged: " + "横屏");
        } else {
             Log.d("t", "onConfigurationChanged: " + "竖屏");
        }
    }

总而言之,Activity的configChanges属性的值的作用就是当标注的事件被触发时,将不会影响Activity的生命周期,并且会回调onConfigurationChanged(@NonNull Configuration newConfig) 方法.
除以上用法之外android:configChanges属性还有其他的值.常用的参数如下:

参数作用
locale切换了系统语言
orientation屏幕方向发生了改变,比如宣传了屏幕
keyboardHidden键盘的可访问性发生变化,比如用户吊起了键盘
keyboardHidden键盘的可访问性发生变化,比如用户吊起了键盘
screenSize屏幕尺寸发生改变,比如屏幕旋转,SDk版本大于13时,此参数才会导致Activity重建
smallestscreenSize物理屏幕尺寸发生改变,SDk版本大于13时,此参数才会导致Activity重建

**注:**screenSize代表的屏幕尺寸变化是逻辑上的改变,比如屏幕旋转之后,以前的长变成了宽, 宽变成了长.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值