您的位置:首页 > 其它

Activity,Fragment,Service的生命周期总结

2017-11-22 17:12 267 查看

1.Activity的生命周期



1.启动了一个Activity,通常是Intent来完成。启动一个Activity首先要执行的回调函数是onCreate(),通常在代码中你需要在此函数中绑定布局,绑定控件,初始化数据等做一些初始化的工作。

2.即将执行Activity的onStart()函数,执行之后Activity已经可见,但是还没有出现在前台,无法与用户进行交互。这个时候通常Activity已经在后台准备好了,但是就差执行onResume()函数出现在前台。

3.即将执行Activity的onResume()函数,执行之后Activity不止可见而且还会出现在前台,可以与用户进行交互啦。

4.由于Activity执行了onResume()函数,所以Activity出现在了前台。也就是Activity处于运行状态。

5.处于运行状态的Activity即将执行onPause()函数,什么情况下促使Activity执行onPause()方法呢?

 [1]启动了一个新的Activity

 [2]返回上一个Activity

 可以理解为当需要其他Activity,当前的Activity必须先把手头的工作暂停下来,再来把当前的界面空间交给下一个需要界面的Activity,而onPause()方法可以看作是一个转接工作的过程,因为屏幕空间只有那么一个,每次只允许一个Activity出现在前台进行工作。通常情况下onPause()函数不会被单独执行,执行完onPause()方法后会继续执行onStop()方法,执行完onStop()方法才真正意味着当前的Activity已经退出前台,存在于后台。

6.Activity即将执行onStop()函数,在“5”中已经说得很清楚了,当Activity要从前台切换至后台的时候会执行,比如:用户点击了返回键,或者用户切换至其他Activity等。

7.当前的Activity即将执行onDestory()函数,代表着这个Activity即将进入生命的终结点,这是Activity生命周期中的最后一次回调生命周期,我们可以在onDestory()函数中,进行一些回收工作和资源的释放工作,比如:广播接收器的注销工作等。

8.执行完onDestory()方法的Activity接下来面对的是被GC回收,宣告生命终结。

9.很少情况下Activity才走“9”,网上一些关于对话框弹出后Activity会走“9”的说法,经过笔者验证,在某个Activity内弹出对话框并没有走“9”,所以网上大部分这样说法的文章要么是没验证,要么直接转载的,这个例子说明,实验出真知,好了,不废话了,那么什么情况下,Activity会走“9”呢?看看下面这位博主才是真的懂得“实验出真知”的人:

http://blog.csdn.net/a872822645/article/details/62217965

10.当用户在其他的Activity或者桌面回切到这个Activity时,这个Activity就会先去执行onRestart()函数,Restart有“重新开始”的意思,然后接下来执行onStart()函数,接着执行onResume()函数进入到运行状态。

11.在“10”中讲的很清楚了。

12.高优先级的应用急需要内存,此时处于低优先级的此应用就会被kill掉。

13.用户返回原Activity。

下面来着重说明一下Activity每个生命周期函数:

onCreate():

 表示Activity正在被创建,这是Activity生命周期的第一个方法。通常我们程序员要在此函数中做初始化的工作,比如:绑定布局,控件,初始化数据等。

onStart():

 表示Activity正在被启动,这时候的Activity已经被创建好了,完全过了准备阶段,但是没有出现在前台,需要执行onResume()函数才可以进入到前台与用户进行交互。

onResume():

 表示Activitiy已经可见了,并且Activity处于运行状态,也就是Activity不止出现在了前台,而且还可以让用户点击,滑动等等操作与它进行交互。

onPause():

 表示Activity正在暂停,大多数情况下,Activity执行完onPause()函数后会继续执行onStop()函数,造成这种函数调用的原因是当前的Activity启动了另外一个Activity或者回切到上一个Activity。还有一种情况就是onPause()函数被单独执行了,并没有附带执行onStop()方法,造成这种函数调用的原因很简单,就是当前Activity里启动了类似于对话框的东东。

onStop():

 表示Activity即将停止,我们程序员应该在此函数中做一些不那么耗时的轻量级回收操作。

onRestart():

 表示Activity正在重新启动。一般情况下,一个存在于后台不可见的Activity变为可见状态,都会去执行onRestart()函数,然后会继续执行onStart()函数,onResume()函数出现在前台并且处于运行状态。

onDestory():

 表示Activity要被销毁了。这是Activity生命中的最后一个阶段,我们可以在onDestory()函数中做一些回收工作和资源释放等,比如:广播接收器的注销等。

2.Fragment的生命周期



1.当添加一个碎片后,第一个执行的生命周期函数是onAttach(),这个函数是用来与添加这个碎片的Activity建立关联的,因此getActivity才会返回正确的Activity实例对象。

2.与Activity的onCreate()生命周期函数类似,它也是用来绑定布局,控件,初始化数据等。

3.接下来就是加载布局了,会调用onCreateView()来对布局进行加载。

4.确保与碎片相关联的活动一定已经创建完毕的时候调用。

5.跟Activity的onStart()生命周期函数是一样的意思,表示碎片实例已经创建完毕,存在于后台,需要执行onResume()才能出现在前台。

6.接下来执行onResume(),创建好的碎片实例将出现在前台。

7.碎片实例出现在前台,可以与用户进行交互了。

8.用户点击返回键或者碎片被替换或是移除。接下来会执行onPause()方法,碎片中的onPause()通常不会单独执行,会顺带执行onStop()方法。

9.当碎片被添加到返回栈,然后被移除或是替换。接下来会执行onPause()方法,碎片中的onPause()通常不会单独执行,会顺带执行onStop()方法。

10.在8中已经说的很清楚了,接下来执行onStop()方法。

11.接下来碎片将会销毁布局,执行onDestoryView()方法,为什么不一起把整个碎片实例销毁呢?因为一个碎片可以改变其关联的布局的。

12.在9中已经说的很清楚了,接下来执行onStop()方法。

13.接下来碎片将会销毁布局,执行onDestoryView()方法,在9中说的很清楚了,碎片被移除或者替换的时候,布局是肯定要被销毁的。

14.从返回栈返回上一个碎片,或者被替换。

15.碎片被销毁,执行方法onDestory()方法。

16.被销毁的碎片是没有任何用处的,因此与这个被销毁的碎片有关联的Activity会与这个碎片解除关联,执行onDetach()就是与当前Activity解除关联的意思。

17.碎片也销毁了,与当前的Activity的关联也解除了,那么这个碎片毫无疑问是完全被销毁了,被垃圾回收器回收了。

下面来谈谈碎片的生命周期中的几个状态:

1.运行状态

  当一个碎片是可见的,并且它所关联的Activity正处于运行状态时,该碎片也处于运行状态。

2.暂停状态

  当一个活动进入暂停状态时(由于另一个未沾满的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态。

3.停止状态

  当一个Activity进入停止状态时,与它关联的碎片
4000
就会进入停止状态,或者通过调用FragmentTransaction的remove(),replace()方法将碎片从Activity中移除,但如果在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。

4.销毁状态

  碎片总是依附于Activity而存在的,因此当活动被销毁时,与它相关的碎片就会进入到销毁状态。或者通过调用FragmentTransaction的remove,replace()方法将碎片从Activity中移除,但在事务提交之前并没有调用addToBackStck()方法,这时的碎片也会进入销毁状态。

3.Service的生命周期

  服务的生命周期有两种,因为服务可以跟Activity绑定起来,也可以不绑定,Activity和服务进行通信的话,是需要把服务和Activity进行绑定的。因此服务的生命周期分为未绑定Activity的和绑定Activity的。

没有绑定Activity的服务生命周期图:



绑定Activity的服务生命周期图:



1.通过Intent和startService()方法启动了一个服务,接下来执行onCreate()方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已在运行,则不会调用此方法。

2.当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)

3.服务开始处于运行状态。

4.某个操作导致服务停止,比如执行了方法stopService(),那么服务接下来会执行onDestory()销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

5.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

6.通过Intent和bindService()方法启动了一个服务,接下来会执行onCreate()方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已在运行,则不会调用此方法。

7.当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null。

8.服务开始处于运行状态。成功与Activity绑定。

9.某个操作导致服务解除绑定,比如执行了方法unbindService(),那么服务接下来会解除与当前Activity的绑定。接下来服务将面临销毁。

10.服务执行onDestory()方法被销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

11.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

关于服务,总结一下:

a. 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。

b. 被绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。

c. 被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。

d. 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。

特别注意:

1、你应当知道在调用 bindService 绑定到Service的时候,你就应当保证在某处调用 unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自动解除,并且Service会自动停止);

2、你应当注意 使用 startService 启动服务之后,一定要使用 stopService停止服务,不管你是否使用bindService;

3、同时使用 startService 与 bindService 要注意到,Service 的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。

5、在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart 任然有效。这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其以后的版本,那么你应当使用 onStartCommand 而不是 onStart。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: