四大组件对于Android开发者是老生常谈的知识了,相信每一个Android开发者对四大组件都已经很熟悉了。可是四大组件做为Android应用的基础,做为开发者不只要熟悉并且要烂熟于心。android
这里以《重温Android四大组件》为题目是为了巩固本身的Android基础,加深对Android的认知。数据库
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方法中须要释放全部资源。进程
触发条件:用户按下back键或者调用了Activity的finish方法。
这个简单的场景是最常出现的。这个场景能够概括为:onCreate()->onStart()-onResume()->点击返回键->onPause()->onStop()->onDestroy()
触发条件:用户按下HOME键或者在任务栏中切换到其它应用。
在这个场景中Activity被放到后台,可是并无被销毁,Activity实例依然在内存中,若是系统没有回收进程,Activity实例会保有以前的状态。这个场景能够概括为:onCreate()->onStart()-onResume()->点击HOME键->onPause()->onStop()->onSaveInstanceState()->返回应用->onRestart()->onStart()->onResume()
触发条件:好比:屏幕方向改变、键盘语言变化等。
在上述条件中,屏幕方向改变应该是最多见的现象。系统配置的改变会致使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方法。
咱们知道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中提供了记录状态的方法。onSaveInstanceState以及onRestoreInstanceState,这两个方法都是用Bundle。除此以外咱们还能看到在onCreate方法中也有一个Bundle类型的参数,这个Bundle就是保存的状态的载体。
咱们知道Activity会因为一些行为被销毁,好比,退出Activity。这些正常的操做会销毁Activity实例,而且系统不会保有Activity的状态。还有一种状况是当Activity处于后台时,因为内存问题会被系统回收或者系统配置改变致使的销毁重建,这个时候系统会保有Activity的状态,就是Bundle存储的数据,在Activity重建是会获取到Bundle中的数据。