Activity、Service生命周期的理解

    一、Activity的生命周期包括以下方法:

      onCreate()、onStart()、onRestart()、onResume()、onPause()、onStop()、onDestroy().

       我们先来了解下各方法都执行什么样的操作。(均来自源码的注释)

       onCreate() :当一个Activity一开始时执行的方法,在这个方法中可以进行的操作包括调用setContentView(...)进行Activity界面填充、调用findViewById(...)获取控件实例、进行多媒体数据库操作如managedQuery(...)等。

      下面分为以下几种情况看结论(结论亲测有效,为了不耽搁时间就不贴代码过程和结果截图了,直接上结论)。

      onStart():紧接着onCreate()之后执行,或者当一个Activity被stop了然后又重新回到当前界面,就会紧接着onResume()之后执行。

      onRestart():不解释,看源注释把→Called after {@link #onStop} when the current activity is being re-displayed to the user (the user has navigated back to it).  It will be followed by {@link #onStart} and then {@link #onResume}.

      onResume():这个方法后Activity就可以和用户进行交互了,这个方法中可是执行动画、使用系统功能如相机等。当然这个方法不能被视为是当前Activity已经对用户可见的标识,onWindowFocusChanged()方法才可以被当做对用户可见的标识。

      onPause():当要一个Activity要进入“幕后”时就会首先调用onPause(),然后才会启动下一个Activity。因此在onPause()中不能执行长时间操作的逻辑。在这个方法中保存持久的状态、停止动画等操作。

      onStop():就是停止一个Activity,但是要注意的是,这个方法可能永远不会被调用,比如当系统内存不足时,执行完onPause()方法后没有足够的内存维持该Activity的进程,onSTop就不会调用。

     onDestroy():销毁Activity。这个方法会执行有两种情况,第一就是调用了finish(),第二就是系统内存不足,可以z在onDestroy中调用isFinish()来区别是哪一种情况导致调用了onDestroy()。


    下面开始进行一个Activity生命周期的实验,实验中程序入口Activity中记为F,在F中启动的Activity记为S。为了方便省时间,没有把代码过程和Log信息截图上来,直接上结论:

      1、当点击桌面图标启动一个应用时,即F启动时执行顺序:

        onCreate()→onStart()→onResume().

    

      2、当屏幕锁屏待机时F执行顺序为:

         onPause()→onStop()  注意没有执行onDestroy()。


      3、当我们打开屏幕时F执行顺序为:

          onRestart(→onStart()→onResume()。

 

      4、当我们按下back建时F执行顺序为:

         onPause()→onStop()→onDestroy()   实际上如果没有特殊处理,此时的Activity在按Back建返回即被杀掉了。


      5、当我们按下Home建时F执行顺序为:

        onPause()→onStop().


      6、当在F中启动S时执行顺序为(注意,这个时两个Activity的生命周期是交替执行的):

        首先是F执行onPause(),接下来是S执行onCreate()→onStart()→onResume(),然后再执行F的onStop(),也就是当S的Activit可以与用户进行交互时F才被Stop.此时的F并不会被finish掉,而是被放在栈中保存,栈顶部就是S,当然这里只有两个Activity。


      7、当我们在S界面按下back建时执行顺序为:

     首先是S执行onPause(),然后是F执行onRestart()→onStart()→onResume()。接下来S继续执行onStop()→onDestroy(),这样S就被finish掉了。也就是说,当F完全可以进行用户交互时才会将S停止并杀掉。


     总结:当我们在不同的Activity中切换时,总是先暂停当前的Activity(记为F,执行onPause过程),然后会执行要启动的那个Activity(记为S)的生命周期的过程(oncreate、onStart、onResume),当S的onResume执行完毕即可以进行交互时,F才会完全停止(onStop()过程)。


   二、Service的生命周期:

      Service的生命周期包括:

      onCreate()、onStart()(这个方法是api5之前的)、onStartCommand(..)(使用这个方法代替onStart(),当然如果要在5之前请使用onStart)、onDestroy()、onBind()。

     以下分别介绍每个方法的作用:

     onCreate():

     1、使用startService(..)启动服务执行顺序:

      onCreate()→onStartCommand()→onStarat()。并且当出现锁屏待机时也没有任何的反应,此时并不会执行onDestroy().

     2、调用了stopService():直接调用了onDestroy();

     3、执行2后再调用startService():执行流程跟1是一样的。

     4、不调用stopService()直接再次调用startService():

           这次不会再调用onCreate(),直接调用onStartCommand()→onStarat()

     5、按下back建,Activity被kill掉了,但是Service并没有执行onDestroy方法,由此可见当使用startService()时,Service和其调用者是不依赖生存的。


     6、使用bindService():

           直接执行了onCreate()→onBind()。

     7、使用unBindService();  执行了onDestroy()方法.

     8、我们调用bindService()后按下back建Activity被finish掉,此时Service执行了onDestroy()方法,说明调用bindService()方法就让该Service和调用者共生存,存在依赖关系了。


     很多时候一个Service会被多个Activity或Fragment调用,这样可能会使用startService和bindService两种方式,这是有区别的:

     (1)无论多少次的startService又 bindService,Service只被创建一次。
     (2)如果先是bind了,那么start的时候就直接运行Service的onStart方法,
     (3)如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
     只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。


    这个总结就写到这吧,很粗糙,吃饭,都到中午了 - -、

   


    


     

你可能感兴趣的:(Activity、Service生命周期的理解)