1.5.41 Android Service生命周期 绑定类型服务 Binder类

2024-08-21 20:32

本文主要是介绍1.5.41 Android Service生命周期 绑定类型服务 Binder类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务的生命周期跟Activity的生命周期类似。但是生命周期甚至比你关注服务如何创建和销毁更重要,因为服务能够在用户不知情的情况下在后台运行。

一、服务的生命周期---从创建到销毁---可以被分为以下两个路径:

1.  启动类型的服务(A started service):

开启的service要通过其他组件调用startService()方法创建服务。

然后服务无限期的运行,并且必须通过调用stopSelf()方法来终止自己或者其他组件通过调用stopService()方法来终止这个服务。

当服务被终止,系统就会把它销毁。

2.  绑定类型的服务(A bound service):

绑定一个服务器,其他组件(客户端)要调用bindService()方法创建服务。

客户端通过IBinder接口与服务通信。

客户端能够调用unbindService()方法来关闭与服务连接。

多个客户端能够绑定到统一个服务,并且当所有的都解绑以后,系统就会销毁这个service。(服务不需要终止自己)

这两个路径不是完全独立的。

也就是说,你能够绑定一个已经用startService()方法启动的服务。

例如,一个后台的音乐服务能够调用带有标识要播放的音乐的Itent的startService()方法来启动,稍后,可能在用户想要进行一些播放器的控制时,或想要获取有关当前歌曲信息,那么一个Activity就能够调用bindService()方法来绑定这个服务。在这个场景中,直到所有的客户端解绑,stopService()或stopSelf()方法才能实际终止这个服务。

实现生命周期的回调方法(Implementing the lifecycle callbacks) 

像Activity一样,服务也有生命周期回调方法,你实现这些回调方法来监视服务内状态的改变,在合适的时机执行工作。下面的服务框架演示了每个生命周期的回调方法:

 

public class ExampleService extends Service {int mStartMode;       // indicates how to behave if the service is killedIBinder mBinder;      // interface for clients that bindboolean mAllowRebind; // indicates whether onRebind should be used@Overridepublic void onCreate() {// The service is being created}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// The service is starting, due to a call to startService()return mStartMode;}@Overridepublic IBinder onBind(Intent intent) {// A client is binding to the service with bindService()return mBinder;}@Overridepublic boolean onUnbind(Intent intent) {// All clients have unbound with unbindService()return mAllowRebind;}@Overridepublic void onRebind(Intent intent) {// A client is binding to the service with bindService(),// after onUnbind() has already been called}@Overridepublic void onDestroy() {// The service is no longer used and is being destroyed}
}  

 

注意:跟Activity生命周期的回调方法不同,你不需要调用这些回调方法的父类的实现/基类的实现 。

 

以上转载:http://blog.csdn.net/think_soft/article/details/7299443 

二、通过实现这些回调方法,你能够监视服务生命周期的两个嵌套循环:

1.  The entire lifetime

service整体的生命周期是从onCreate()被调用开始,到onDestroy()方法返回为止。

发生在onCreate()和onDestroy()方法调用之间的服务整体生命周期,跟Activity一样,服务在onCreate()方法完成初始化安装,在onDestroy()方法中释放所有的保留资源。

例如,一个音乐回放的服务能够在onCreate()方法中播放音乐的地方创建一个线程,然后在onDestroy()方法中终止这个线程。

所有的服务都会调用OnCreate()和onDestroy()方法,不管是startService()方法还是bindService()方法创建的服务。

2. The active lifetime

service积极活动生命周期(active lifetime)是从onStartCommand() 或onBind()被调用开始 ,每个方法都分别处理传递给startService()或bindService()方法的Intent。

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。
这个时候把调用者(Context,例如Activity)和Service绑定在一起,Context退出了,
Srevice就会调用onUnbind->onDestroy相应退出。 

如果是启动类型的服务,它的积极活动生命周期和整体生命周期一同结束(服务一直存活到onStartCommand()方法返回之后)。

如果是绑定类型的服务,那么积极活动生命周期在onUnbind()方法返回时结束。

注意:尽管启动类型的服务通过调用stopSelf()或stopService()方法来终止服务,但是有的服务没有对应回调方法(如没有onStop()回调方法)。因此,除非服务被绑定到了客户端,否则在服务被终止时(只在接受onDestroy()回调方法的时候)系统就会销毁它。

图2说明了一个服务的典型回调方法。尽管这个图把由startService()方法创建的服务与由bindService()方法创建的服务给分开了,但是请记住,任何服务,不管它是怎样启动的,都可能允许客户绑定它。因此用onStartCommand()方法(通过一个客户端调用startService()方法)初始启动的服务,依然能够接收onBind()的调用(在客户端调用bindService()方法时)。

3.Managing the Lifecycle of a Bound Service

当绑定service和所有客户端解除绑定之后,Android系统将会销毁它,(除非它同时被onStartCommand()方法开启)。

因此,如果你的service是一个纯粹的绑定service,那么你不需要管理它的生命周期。

然而,如果你选择实现onStartCommand()回调方法,那么你必须显式地停止service,因为service此时被看做是开启的。

这种情况下,service会一直运行到它自己调用 stopSelf()或另一个组件调用stopService(),不论它是否和客户端绑定。

另外,如果你的service被开启并且接受绑定,那么当系统调用你的 onUnbind()方法时,如果你想要在下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你可以选择在 onUnbind()中返回true。

onRebind()的返回值为void,但是客户端仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。

  下图展示了这种service(被开启,还允许绑定)的生命周期:

 

 

以上转载:http://www.cnblogs.com/mengdd/archive/2013/03/24/2979944.html

三、Android 绑定类型服务器---继承Binder类

如果你只在应用程序的局部使用服务,并且不需要跨进程工作,那么你能够实现自己的Binder类,用它直接给你的客户端提供访问服务中公共方法的能力。注意:通常,客户端和服务端只是在同一个应用和进程中工作,例如,对于一个要良好工作的播放音乐的应用程序,就需要把在后台工作的播放音乐的服务与应用自己的一个Activity绑定。

以下是建立绑定类型服务的步骤:

1. 在服务中,使用以下方法之一创建Binder实例:

   A. 包含客户端能够调用的公共方法;

   B. 返回当前服务的实例,它有客户端能够调用的公共方法;

   C. 或者返回一个带有客户端能够调用的公共方法的被服务持有的另一个类。

2.  从onBind()回调方法中返回这个Binder对象的实例;

3.  在客户端,在onServiceConnected()回调方法中接收Binder对象,并且使用这个对象提供的方法来调用被绑定的服务。

 

以上转载:http://blog.csdn.net/think_soft/article/details/7303479#comments

这篇关于1.5.41 Android Service生命周期 绑定类型服务 Binder类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094206

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁