`
android_mylove
  • 浏览: 399635 次
社区版块
存档分类
最新评论

Android Service 服务(三)—— bindService与remoteService

 
阅读更多

一、bindService简介

bindService是绑定Service服务,执行service服务中的逻辑流程。

service通过Context.startService()方法开始,通过Context.stopService()方法停止;也可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己。只要调用一次stopService()方法便可以停止服务,无论之前它被调用了多少次的启动服务方法。

客户端建立一个与Service的链接,并使用此链接与Service进行通话,通过Context.bindService()方法来绑定服务,Context.unbindService()方法来关闭服务。多个客户端可以绑定同一个服务,如果Service还未被启动,bindService()方法可以启动服务。

上面startService()和bindService()两种模式是完全独立的。你可以绑定一个已经通过startService()方法启动的服务。例如:一个后台播放音乐服务可以通过startService(intend)对象来播放音乐。可能用户在播放过程中要执行一些操作比如获取歌曲的一些信息,此时activity可以通过调用bindServices()方法与Service建立连接。这种情况下,stopServices()方法实际上不会停止服务,直到最后一次绑定关闭。


二、bindService启动流程

context.bindService() ->onCreate() ->onBind() ->Service running ->onUnbind() ->onDestroy() ->Service stop

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

所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。详见:Android Service 服务(一)—— Service


三、bindService生命周期

像一个activity那样,一个service有些可以用来改变状态的生命周期方法,但是比activity的方法少,service生命周期方法只有三个public

void onCreate()

void onStart(Intent intent)

void onDestroy()

通过实现这三个生命周期方法,你可以监听service的两个嵌套循环的生命周期:

1、整个生命周期

service的整个生命周期是在onCreate()和onDestroy()方法之间。和activity一样,在onCreate()方法里初始化,在onDestroy()方法里释放资源。例如,一个背景音乐播放服务可以在onCreate()方法里播放,在onDestroy()方法里停止。

2、活动的生命周期

service的活动生命周期是在onStart()之后,这个发法会处理通过startServices()方法传递来的Intent对象。音乐service可以通过开打intent对象来找到要播放的音乐,然后开始后台播放。注: service停止时没有相应的回调方法,即没有onStop()方法。

onCreate()方法和onDestroy()方法是针对所有的services,无论它们是否启动,通过Context.startService()和Context.bindService()方法都可以访问执行。然而,只有通过startService()方法启动service服务时才会调用onStart()方法

如果一个service允许别人绑定,那么需要实现以下额外的方法:

IBinder onBind(Intent intent)

boolean onUnbind(Intent intent)

void onRebind(Intent intent)

onBind()回调方法会继续传递通过bindService()传递来的intent对像

onUnbind()会处理传递给unbindService()的intent对象。如果service允许绑定,onBind()会返回客户端与服务互相联系的通信句柄(实例)。

如果建立了一个新的客户端与服务的链接,onUnbind()方法可以请求调用onRebind()方法。


记住任何服务,无论它怎样建立,都默认客户端可以链接,所以任何的service能够接收onBind()和onUnbind()方法


四、bindService示例

Activity


Service


AndroidManifest.xml



五、代码解析

1、 Activity中,Intent intent = new Intent("com.homer.bind.bindService"); 构建一个service的action,然后bindService(intent, sc, Context.BIND_AUTO_CREATE); 绑定服务

2、 Activity中,通过private ServiceConnection sc = new ServiceConnection() 建立一个Service连接,onServiceConnected()获取Service实例,onServiceDisconnected()释放连接

3、 Service中,重载onBind(Intent intent)方法,返回Service实例(即BindMusicService)给Activity,然后执行onCreate()函数(注:bindService不执行onStart()函数)

4、 Activity中,通过返回的Service实例musicService,执行音乐播放的操作(play、pause、stop等)


六、Remote Service拓展

通常每个应用程序都在它自己的进程内运行,但有时需要在进程之间传递对象(IPC通信),你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在android平台中,一个进程通常不能访问其它进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事。

AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如在一个Activity中)访问另一个进程中(例如一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数

要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:

IMusicControlService.aidl


使用eclipse的Android插件,会根据这个aidl文件生成一个Java接口类,生成的接口类中会有一个内部类Stub类,Service来继承该Stub类:
Service

客户端(Activity)应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:

Activity


Remote Service流程总结:

1、 Activity(客户端)中,Intent intent = new Intent("com.homer.remote.remoteMusicReceiver");构建intent,然后bindService(intent, sc, Context.BIND_AUTO_CREATE);绑定服务

2、 Activity(客户端)中,通过ServiceConnection()重载onServiceConnected()建立连接,获取Service.Stub实例;onServiceDisconnected()释放连接(与bindService类似)

3、 Service中,通过重载onBind(Intent intent) 返回Service.Stub实例,但Service.Stub类是由aidl文件生成的接口类中的一个内部类Stub类,Service来继承该Stub类

4、 Activity中,通过操作Service实例(musicService),执行音乐播放操作(play、pause、stop等)


源码下载



参考推荐:

Service (android developer)

Android Service 服务(一)—— Service

Android Service 服务(二)—— BroadcastReceiver

android中service和aidl详细整理

Android Service AIDL

android笔记--Service与AIDL


分享到:
评论

相关推荐

    Android Service与BroadcastReceiver、bindService示例详解

    Android Service与BroadcastReceiver、bindService示例详解,代码非常详细,详解博客网址:http://blog.csdn.net/sunboy_2050/article/details/7364024

    2011.09.01(3)——— android service startService bindService

    当你使用 `bindService()` 时,你与 `Service` 建立了一个绑定关系,这允许你通过 `Binder` 对象直接与 `Service` 进行交互,进行更细粒度的控制。在调用 `bindService()` 后,系统会调用 `Service` 的 `onBind()` ...

    Android 远程服务(remote service)

    在Android开发中,远程服务(Remote Service)是一种可以让应用程序组件在其他进程中运行的服务,通常用于实现跨进程通信(IPC,Inter-Process Communication)。这个概念是Android系统为了支持不同应用之间的数据...

    Android中startService()和bindService()的测试

    实例详解Android中startService()和bindService()的区别。 说明详见http://blog.csdn.net/a343902152/article/details/50857316

    Android 的 Remote Service 开发实例RemoteService

    5. 使用服务:在客户端应用中,首先需要创建一个对服务的代理对象,然后通过`startService()`或`bindService()`与服务建立连接。例如: ```java Intent intent = new Intent(); intent.setComponent(new ...

    Android学习之路——7.Service

    本篇文章将深入探讨“Android学习之路——7.Service”,分析Service的基本概念、使用方式以及常见应用场景,同时结合源码解析Service的工作原理,并提供一个实战Demo——Service_Demo。 一、Service基本概念 ...

    bindservice

    在Android应用开发中,`bindService()`方法是用于将客户端(通常是Activity或BroadcastReceiver)与服务(Service)进行连接的关键操作。服务是Android系统中的一种组件,它可以在后台执行长时间运行的任务,即使...

    Android startService bindService Aidl service基础全

    通过调用`bindService()`方法,客户端可以建立与服务的连接,获取服务的`IBinder`接口,从而直接调用服务的方法。绑定服务常用于需要频繁且短时间的交互,例如数据同步。服务会重写`onBind()`方法返回`IBinder`对象...

    音乐播放器bindservice和startService

    2. `bindService`:与`startService`不同,`bindService`不仅启动服务,还创建了一个客户端-服务器接口,允许应用组件与服务进行交互。这意味着你可以直接调用服务的方法,例如控制播放、暂停、快进、倒退等。当所有...

    Android 的 Remote Service 开发实例RemoteServiceClient

    Remote Service是一种特殊的服务类型,允许其他应用程序组件或者甚至不同的应用程序通过Binder机制来与服务进行交互。本教程将深入探讨如何开发一个Android的Remote Service,并创建一个名为`RemoteServiceClient`的...

    android使用bindService例子

    在Android开发中,`bindService()` 是一个关键的API,用于连接到远程服务,以便进行更复杂的交互。在这个例子中,我们有两个项目:`MyApplication` 和 `AIDLClient`,它们分别扮演服务提供者和服务使用者的角色。...

    android service 简单实例源代码

    在Android开发中,Service是四大组件之一,它在后台运行,不与用户界面直接交互,常用于执行长时间的任务,如播放音乐、网络通信等。本篇文章将深入解析"android service 简单实例源代码",帮助你理解如何在Android...

    Android25闹钟项目——音乐播放

    本文将详细讲解如何使用Android的`MediaPlayer`类在Activity和Service中播放音乐,以实现"Android25闹钟项目——音乐播放"的功能。 首先,我们要了解`MediaPlayer`类。它是Android SDK提供的一种多媒体播放器,支持...

    Android Remote Service

    在Android应用开发中,服务(Service)是一种在后台运行,不与用户交互的组件。它非常适合执行长时间运行的任务,如播放音乐、网络通信等。"Android Remote Service"着重讲解了如何实现一个运行在不同进程中的远程...

    Android RemoteService AIDL 方式实现

    而RemoteService则是一种特殊的服务,它可以跨应用提供接口,允许不同应用程序之间进行通信和数据交换。AIDL(Android Interface Definition Language)是Android提供的一个工具,用于在不同进程间定义和实现接口,...

    Android service讲解文档ppt

    `onStartCommand()`用于启动服务并返回服务的启动行为,`onBind()`用于提供与服务进行交互的Binder对象。 3. 在AndroidManifest.xml中注册Service。 4. 使用`startService()`或`bindService()`方法启动或绑定到...

    Android教材————

    Service可以通过startService()启动,或者通过bindService()与之绑定,两者在生命周期和使用场景上有明显区别。 最后,第八讲涉及了Content Provider。Content Provider是Android系统中数据共享的关键机制,允许...

    android学习之Service启动1

    - 这种方式将应用与服务绑定,创建一对一的连接,适合需要与服务进行频繁通信的情况。 - 调用`bindService()`时,系统会回调服务的`onBind()`方法,返回一个实现了`IBinder`接口的对象,用于客户端和服务之间的...

Global site tag (gtag.js) - Google Analytics