Activity的生命周期


       一个应用程序通常由多个activities组成,他们通常是松耦合关系。通常,一个应用程序中的activity被指定为"main"activity。当第一次启动应用程序的时候,“main”activity被显示出来。每一个activity可以启动另一个activity来完成其他不同的动作。每次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。

    当一个activity因新的一个activity启动而停止,旧的activity通过它的生命周期回调方法改变其状态。一个activity根据状态变化会调用多个生命周期方法,无论系统创建它、停止它、恢复它、摧毁它,每个回调方法被提供用以完改变activity状态。

       

    每个activity都有四个状态:

  • active state: activity位于屏幕顶层,用户可见,获得焦点。
  • paused state:旧的activity失去焦点,新的activity的界面覆盖住旧的activity的部分界面。此时     activity还是存活的,内存保存它的所有变量。
  • stopped state:旧的activity失去焦点,新的activity的界面覆盖住旧的activity的全部界面,用户不可见。此时     activity还是存活的,内存保存它的所有变量。
  • drop state: 当系统需要内存时,系统通过调用activity的finish方法或是简单杀死进程的方式销毁掉处于paused state或stopped state的activity。

                         Activity的生命周期_第1张图片




   onCreate到onDestroy,整个activity的生命周期;在onStart到OnStop这一阶段,activity是可见周期;在onResume到onPause这一阶段,activity是前台周期。

    Activity中上面的七个方法代表了Activity生命周期的七个阶段,其中当Activity第一次被创建的时候会执行onCreate方法,而当Activity创建完后并且展示给用户的时候会调用onStart方法,接着如果该Activity获得焦点将会由Android系统调用该Activity的onResume方法,接下来,如果该Activity执行了另外一个Activity,那么上一个Activity的onPause方法会被调用以执行一些资源的释放操作,接下来执行新的Activity的onCreate,onStart以及onResume方法,如果新建的Activity完全覆盖了原来的Activity,那么原来Activity的stop方法将会被调用。而当从新建的Activity中会到原来的Activity时onRestart方法会被调用,并连续执行onStart()以及onResume(),此时不会再执行onCreate(),因为该Activity并未被销毁,如果在Activity中执行了finish()或者Android系统需要回收资源时可能会执行Activity的onDestroy()。

      注意,在Activity的执行过程中,存在一个Task的概念,Task其实就是一个Activity栈,先进后出,其中首先执行的Activity入栈,接下来执行的Activity继续入栈,如果Activity执行了finish(),将不会被放入Task栈中,新的Activity入栈的时候,上一个Activity会执行onPause(),接下来是刚入栈的Activity的onCreate,onStart,onResume方法,接下来可能会执行上一个Activity的onStop方法,当从Task栈中弹出Activity的时候,会首先执行上一个弹出的Activity的onPause(),接着执行当前Activity的onRestart(),onStart()以及onResume(),再执行上一个弹出的Activity的onStop()以及onDestroy()。弹出的Activity若要再次被执行,即进入Task栈,需要再次执行onCreate来创建它,因为此时它已经被销毁,不能再onRestart了。

 

                               Activity的生命周期_第2张图片


      

     当一个activity被paused和stopped,activity的状态维持着。

     1.当activity对象仍然存活在内存时
        所有的信息关于它的成员变量和当前状态都存在,当activity返回到前台时,这些变化仍然存在。
   2.当系统销毁activity回收了内存时
        activity对象被摧毁了,所以系统不能简单的恢复它。如果用户重新进入这个activity时,用户希望activity是它刚才的那个,系统必须再次创建Activity对象。在这种情况下,你可以通过实现一个额外的回调函数来保存前一个activity的重要信息。当系统重新创建它的时候,随后可以利用保存的信息来恢复它。
  这个保存当前状态信息的回调函数是onSaveInstanceState()。系统在摧毁activity之前调这个函数,它传递一个Bundle对象。Bundle就是存放状态信息的地方,采用name-value对,使用方法如putString()。然后,如果系统杀死你的activity进程并且用户浏览回到你的activity,系统传递Bundle给onCreate,这样你就可以恢复activity状态到你onSaveInnstanceState()时候保存的状态。如果没有信息被保存,传递给onCreate()的Bundle是null。
  注意:不保证onSaveInstanceState()将会被调用,在你的activity被摧毁前。因为有不需要存储的情况存在(例如当用户离开你的activity,用户显示的结束)。如果这个方法被调用,它总是在onStop()前,概率性在onPause()前。
  虽然onSaveInstanceState()的默认保存实现对activity UI很有用,但是仍需要覆盖它来保存额外的信息。例如,你或许需要保存在activity生命期间变化的成员变量(和保存在UI中的数据有关,但保存这些UI值的变量却不会被默认保存)。
  因为默认的onSaveInstanceState()帮你保存UI状态,如果你为了保存额外的信息覆盖这些方法,你应该每次在做工作之前调用父类onSaveinstanState()。
  注意:因为onSaveInstanceState()不保证被调用,你应该用它仅用它记录临时状态关于你的activity--你应该永远不用它来存储永久性数据。你应该用onPause()来存储永远性数据(例如保存在数据库中的数据)当用户离开activity。
  

  可是,即使你不做什么事也不实现 onSaveInstanceState(),一些activity的状态还是会被activity类的默认onSaveInstanceState()保存。特别是在布局方面上,保存每一个视图提供它自己的信息。几乎所有 的Android框架中的widget合适的实现这个方法。这样对UI的任何可见的变化都会被保存。例如,EditText widget保存任何文本被用户输入的,并且CheckBox widget保存是否选中还是没选中。惟一的保存要求是提供一个惟一的ID(通过android:id属性)给每一个希望保存状态的widget。如果一个widget没有ID,那么 它不保存它的状态。


  简单的转换设备改变屏幕方向是一个好的测试保存状态的好方法。当屏幕方向变化,系统为了应用可选的资源,适合新方向,要摧毁并重建activity。出于这个原因,你的activity恢复它的状态当创建的时候非常重要。


进程生命周期:

       1.前台的activity,位于屏幕顶部,认为最重要的进程。

       2.可见的activity,位于屏幕的非顶部,比较重要的进程。

       3.后台的activity,无可见的activity,不太重要。

       4.空进程,没有activity,service,broadcastReceiver应用组件的进程,最易被系统杀死。因此任何后台的操作必须放在service或broadcastReceiver中进行。例如照相机应用中,上传照片到互联网上,这是一个很耗时的操作,在activity中需要开启一个service,标定service的优先权,在整个上传过程中,享有高优先级,这样就可以保证不会被系统轻易的销毁掉了,于此同时,原activity无论是paused,stopped,finished的都不会影响上传工作。否则,activity销毁,进程变为空进程,容易被销毁的。

你可能感兴趣的:(Android基础)