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

相关文章

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

python中的鸭子类型详解

《python中的鸭子类型详解》鸭子类型是Python动态类型系统的灵魂,它通过强调“行为”而非“类型”,赋予了代码极大的灵活性和表现力,本文给大家详细介绍python中的鸭子类型,感兴趣的朋友一起看... 目录1. 核心思想:什么是鸭子类型?2. 与“传统”静态类型语言的对比3. python 中无处不在

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1