重温Android四大组件(一)—Activity的生命周期

前言

四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了。但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心。

这里以《重温Android四大组件》为题目是为了巩固自己的Android基础,加深对Android的认知。

Activity生命周期探索

Activity生命周期是Activity在不同场景下表现的一种状态,在Android开发中的表现就是提供给开发者的生命周期函数。使用Activity生命周期函数的目的就是定义Activity在不同时期的表现。下图是Android官方文档中提供的Activity生命周期函数回调。在这张图中可以看到Activity在各种场景中的状态变化。

  • onCreate() 表示Activity正在被创建。在系统首次创建时触发,并且onCreate在整个Activity生命周期中只触发一次。在onCreate中我们可以做一些初始化工作。

  • onStart() 表示Activity正在启动。此时Activity对用户可见,并且正在准备进入前台并且变得可交互。

  • onReStart() 表示Activity正在重新启动。一般来说Activity从后台回到前台时会调用onRestart方法。比如,用户点击home键将Activity放到后台,然后返回应用。

  • onResume() 表示Activity已经进入到前台,用户可以与Activity进行交互了。Activity将会停留在resume状态直到有其它事件发生时Activity失去焦点,比如说用户切换到其它Activity。

  • onPause() 表示Activity正在停止。也就是说某些事件发生导致用户正在离开当前Activity。在onPause方法中可以释放一些系统资源,比如传感器或者可能影响电池续航的一些行为。但是需要注意的时不能再onPause中作耗时操作,因为在启动其他Activity时,执行过当前Activity的onPause方法后才会执行新的Activity的onResume方法。

  • onStop() 表示Activity即将停止。此时Activity对用户已经是不可见的了,但是此时Activity对象依然在内存中。在onStop中可以做一些稍微重量级的操作,比如数据库操作、暂停动画或者处理一些对用户不可见的资源。

  • onDestroy() 表示Activity将要销毁。这是Activity生命周期中的最后一个回调函数。在onDestroy方法中需要释放所有资源。

Activity在不同场景中的生命周期状态

(1)Activity被启动并结束

触发条件:用户按下back键或者调用了Activity的finish方法。

这个简单的场景是最常出现的。这个场景可以归纳为:onCreate()->onStart()-onResume()->点击返回键->onPause()->onStop()->onDestroy()

(2)用户切换出当前应用

触发条件:用户按下HOME键或者在任务栏中切换到其它应用。

在这个场景中Activity被放到后台,但是并没有被销毁,Activity实例依然在内存中,如果系统没有回收进程,Activity实例会保有之前的状态。这个场景可以归纳为:onCreate()->onStart()-onResume()->点击HOME键->onPause()->onStop()->onSaveInstanceState()->返回应用->onRestart()->onStart()->onResume()

(3)系统配置变化

触发条件:比如:屏幕方向改变、键盘语言变化等。

在上述条件中,屏幕方向改变应该是最常见的现象。系统配置的改变会导致Activity的销毁以及重建。生命周期变化是:onCreate()->onStart()->onResume()->屏幕方向变化->onPause()->onStop()->onSaveInstanceState()->onDestory()->onCreate()->onStart()->onRestoreInstanceState()->onResume()。

可以看到在屏幕方向变化期间,Activity经历了销毁和重建两个过程。可以注意到在这期间有两个方法被调用到,它们分别是onSaveInstanceState和onRestoreInstanceState,这两个方法时用来恢复Activity状态使用的,通过Bundle传递参数。

在上面的情况中,由于Bundle无法传递大量的数据,开发者可以选择自己处理系统配置变化。在AndroidManifest.xml文件中改变Activity的配置。比如,处理屏幕方向改变可以加入配置:android:configChanges="orientation"。这个时候屏幕方向改变是就会调用onConfigurationChanged方法。此时的生命周期变化是:onCreate()->onStart()->onResume()->屏幕方向变化->onConfigurationChanged()。

可以看到,如果开发者自己处理系统配置改变,那么Activity就不会销毁重建了,而是直接调用onConfigurationChanged方法。

(4)启动模式对生命周期的影响

我们知道Activity有4中启动模式,分别是standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)。启动模式不同也会导致Activity生命周期不同的变化。

  • standard(标准模式):标准模式下的Activity在每次启动时都会创建新的Activity实例,它的生命周期跟上面图中所示相差无几。

  • singleTop(栈顶复用模式):在这种模式下的Activity如果处于Activity栈栈顶,那么会复用Activity实例,启动的时候就会调用onNewIntent()->onRestart()->onStart()->onResume()。如果不是处于栈顶就会调用onCreate()->onRestart()->onStart()->onResume()。

  • singleTask(栈内复用模式):在这个模式下的Activity只要在Activity栈内存在实例就会复用这个实例,那个生命周期变化是:onNewIntent()->onRestart()->onStart()->onResume()。

  • singleInstance(单实例模式):在这种模式下Activity单独存在一个Activity栈中,启动调用onCreate()->onRestart()->onStart()->onResume()

通过Activity生命周期函数记录Activity状态

在上面的系统配置变化的例子中可以看到Activity中提供了记录状态的方法。onSaveInstanceState以及onRestoreInstanceState,这两个方法都是用Bundle。除此之外我们还能看到在onCreate方法中也有一个Bundle类型的参数,这个Bundle就是保存的状态的载体。

我们知道Activity会由于一些行为被销毁,比如,退出Activity。这些正常的操作会销毁Activity实例,并且系统不会保有Activity的状态。还有一种情况是当Activity处于后台时,由于内存问题会被系统回收或者系统配置改变导致的销毁重建,这个时候系统会保有Activity的状态,就是Bundle存储的数据,在Activity重建是会获取到Bundle中的数据。

总结

在上面介绍了Activity在各种场景下的生命周期表现。理解这些生命周期的调用有利于在开发时更好的处理Activity与用户的交互,同时也能避开一些常见的问题。

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

你可能感兴趣的:(重温Android四大组件(一)—Activity的生命周期)