`

Service生命周期

阅读更多

1. Service 生命周期

1)   可以通过调用 Context.startService() 启动一个 Service ,这可能会触发 Service onCreate() onStart() 操作,具体来说即执行 startService() 一定会触发 onStart() ,但如果该 Service 已经在系统中存在,则 onCreate() 不会被再次调用,它只在 Service 第一次启动时触发。

通过 Context.startService() 启动的 Service 会一直运行,直到通过 Context.stopService() 或者 stopSelf() 停止它。多次通过 startService() 启动某个服务并不会生成多个实例,但会导致服务的 onStart() 被多次调用,当然由于只有一个实例,因此无论启动多少次,停止它只需调用一次 Context.stopService() stopSelf() 就可以了。

 

2)  也可以通过 Context.bindService() 来获得一个服务的链接,这个链接是一直会保持到通过 Context.unbindService() 断掉它。如果在连接时系统中还没有该服务,则可能会新创建一个服务,这时 Service onCreate 函数也同样会被调用。连接建立时会 Service onBinder 会被触发,通过 onBinder 可以返回连接建立后的 IBinder 接口对象,使用服务的客户端(比如某个 Activity )可以通过 IBinder 对象和 Service 交互。

     一个 Service 如果是通过 bindService() 启动的,那么它会一直存在到没有任何客户端与它保持连接为止,原因是可能有很多客户端与这个服务保持连接,这时如果某个链接被客户端主动断掉只会是 Service 的链接数减 1 ,当减至 0 的时候这个 Service 就会被销毁。

 

3)   一个 Service 既可以被启动 (start) 也可以被连接 (bind) ,这时 Service 的生命周期取决于它被创建的方式,如果是通过 Context.startService() 创建的则和第一种情况一样,如果是通过 Context.bindService() 使用参数 Context.BIND_AUTO_CREATE 创建的,则情况和第二种一样。

     当然,在 Service 停止,被销毁时,会触发其 onDestroy() 函数,我们需要在这里完成这个 Service 相关资源的清理,比如停止其子线程,注销监听器等等。

 

2. 相关的官方描述 (Android SDK1.5) 如下:

android-sdk 文档 /docs/reference/android/app/Service.html

1)  There are two reasons that a service can be run by the system. If someone calls Context.startService() then the system will retrieve the service (creating it and calling its onCreate()  method if needed) and then call its onStart(Intent, int) method with the arguments supplied by the client. The service will at this point continue running until Context.stopService() or stopSelf() is called. Note that multiple calls to Context.startService() do not nest (though they do result in multiple corresponding calls to onStart()), so no matter how many times it is started a service will be stopped once Context.stopService() or stopSelf() is called.

 

2)  Clients can also use Context.bindService() to obtain a persistent connection to a service. This likewise creates the service if it is not already running (calling onCreate() while doing so), but does not call onStart(). The client will receive the IBinder object that the service returns from its onBind(Intent) method, allowing the client to then make calls back to the service. The service will remain running as long as the connection is established (whether or not the client retains a reference on the service's IBinder). Usually the IBinder returned is for a complex interface that has been written in aidl .

 

3)  A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy().

 

如下是 Service 的生命周期时序图:

 

 

 

 

3. 几个需要注意的地方

1)    Service 无论以何种方式创建,都是在应用的主线程里创建的,也就是说创建一个 Service 并不意味着生成了一个新的线程, Service 的创建过程是阻塞式的,因此也需要考虑性能,不能影响界面和逻辑上的后续操作。

 

2)   如果 Service 自己没有生成新的线程,那它也是运行在应用的主线程里的,因此 Service 本身并不能提高应用的响应速度和其他的性能,而是说通过这个后台服务生成新的线程来处理比较耗时的操作如大数据的读取等来提高响应, Service 自己并不能保证这一点。 Service 相当于提供了一个这些费时操作的平台,由它在后台创建新线程完成这些任务,以及视各种情况管理这些线程,包括销毁。

 

3)   stopService unbindService 都可以把 Service 停掉,但是如果希望明确立刻停掉 Service ,则使用 stopService 更安全,因为 unbindService 实质上是将与 Service 的连接数减一,当减为 0 的时候才会销毁该服务实例, stopService 的效果相当于将连接数立即减为 0 ,从而关闭该服务,所以在选择关闭方式上要视不同情况而定。

分享到:
评论

相关推荐

    spring中service生命周期(xml/annotation)

    在Spring框架中,Service层是业务逻辑的核心...以上就是关于Spring中Service生命周期的管理和配置,包括XML和注解方式的详细介绍。通过理解和熟练掌握这些知识,开发者能够更好地设计和维护Spring应用中的业务逻辑层。

    Activity和Service生命周期及使用AIDL通信实例备份

    本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...

    Android Service生命周期及用法!

    `onDestroy()`则在Service被停止时调用,标志着Service生命周期的结束。值得注意的是,Service的生命周期管理需要谨慎处理,以避免内存泄漏和不必要的资源消耗。 Service与Activity之间的通信是通过Binder机制实现...

    Android说明Service生命周期的代码例子

    Service生命周期的理解和正确管理对于优化应用程序性能至关重要。以下是一个关于Service生命周期的详细解析,结合代码示例来阐述如何在Android中操作Service。 1. **Service生命周期概述** Service的生命周期主要...

    Android-Service生命周期及用法最新版本

    本文档主要讲述的是 Android Service生命周期及用法;Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),...

    android项目教程Service生命周期.pptx

    - 未绑定Activity的Service生命周期图显示了startService()启动的过程,而绑定Activity的Service生命周期图则展示了bindService()启动的过程,两者在生命周期上有显著差异。 理解并熟练掌握Service的生命周期及其...

    AndroidService生命周期及用法[收集].pdf

    使用`startService()`方法启动Service,这会导致Service生命周期中的`onStartCommand()`被调用。若要停止Service,可以调用`stopService()`。需要注意的是,即使调用了`stopService()`,Service可能并不会立即停止,...

    Android中Service生命周期演示案例的任务要求.pdf

    6. **Service生命周期**: Service的生命周期包括`onCreate()`, `onStartCommand()`, `onBind()`, `onUnbind()`, `onDestroy()`等关键方法。在创建Service时,会调用`onCreate()`,接着如果是通过`startService()`...

    android Service的生命周期

    总的来说,Android Service的生命周期管理是开发者必须掌握的关键技能,正确理解和使用Service生命周期能够确保应用的稳定性和效率,避免不必要的资源消耗。在开发过程中,我们还需要注意Service的权限管理,以及在...

    Android Service生命周期详解

    总的来说,Android Service生命周期管理涉及到一系列的回调方法,通过这些方法,开发者能够精确控制服务的启动、运行和终止,同时确保服务在正确的时间释放资源。合理地使用服务能提高应用的效率和用户体验。在实际...

    基于Android Service 生命周期的详细介绍

    Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那...Service生命周期 : Android

    Android中演示Service生命周期的代码清单.pdf

    本篇文章将详细阐述如何在Android中演示Service的生命周期,并提供相关的代码清单。 首先,Service的生命周期主要由四个主要方法组成:`onCreate()`, `onStartCommand()`, `onBind()`, 和 `onDestroy()`。当Service...

    Android中service基本用法,生命周期1

    startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...

    Android中Service的生命周期解析.pdf

    这是Service生命周期中的最后一个回调,开发者应在此处释放所有资源。 3. 启动服务(Started Service) 当通过startService()启动Service时,Service会在后台无限运行,直到调用stopService()或stopSelf()才会停止...

    ServiceLifecycle:Android Service生命周期

    理解并掌握Service生命周期对于开发高效、稳定的Android应用至关重要。 1. **Service的启动和绑定** - **启动(Start)**: 当通过startService()方法启动Service时,Service会经历onCreate() -> onStartCommand() ...

    service的生命周期以及启动方式

    本教程将深入探讨Service的生命周期及其启动方式,并结合一个求平均值的Demo进行讲解。 首先,我们来理解Service的生命周期。Service有四个主要状态:创建(Created)、启动(Started)、绑定(Bound)和销毁...

    Android组件的生命周期

    - **Service生命周期**: - `onCreate()`:Service首次创建时调用。 - `onStartCommand()`或`onBind()`:根据Service类型(启动型或绑定型),在Service启动时调用。 - `onDestroy()`:Service销毁前调用。 - **...

Global site tag (gtag.js) - Google Analytics