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

前言

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

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

Activity生命周期探索

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

  • onCreate() 表示Activity正在被建立。在系统首次建立时触发,而且onCreate在整个Activity生命周期中只触发一次。在onCreate中咱们能够作一些初始化工做。动画

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

  • onReStart() 表示Activity正在从新启动。通常来讲Activity从后台回到前台时会调用onRestart方法。好比,用户点击home键将Activity放到后台,而后返回应用。xml

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

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

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

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

Activity生命周期

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与用户的交互,同时也能避开一些常见的问题。
相关文章
相关标签/搜索