前面提了start service 是可以独立与调用程序运行的(见http://www.linuxidc.com/Linux/2011-09/42254.htm),也就是说启动它的程序消亡了,该service还是可以继续运行的。
这里的Bound Service 就没这好事了,它仅仅服务于调用它的组件,不能脱离于调用它的组件而生存。人都完蛋了,人体的一些器官有啥用呢。。。
Bound Service 是允许其他的组件(如 Activities)绑定到其上面,可以发送请求,也可以接受请求,甚至可以进行进程间的通信。
那么如何来创建一个Bound Service 呢?当创建一个能提供绑定功能的服务时,我们就必须要提供一个IBinder对象,客户端就可以使用IBinder对象来与服务进行交互,在Android系统中,有三种方式可以创建IBinder:
1.扩展Binder类:这种方式当你的service只给当前的程序用而且在后台执行的时候采用这种方式比较好。意思很简单,不需要跨进程间通信。
2.使用Message机制:消息机制相对于Binder的方式就比较复杂点,它支持跨进程间调用的(这种方式的基础其实也是AIDL,只不过不需要涉及到AIDL那么深),这种情况下,service会定义一个handle来出来不同的object的服务请求,有一点要提起的是,这里的IBinder对所有的客户端来说是共享的。当然我们的客户端也可以定义自己的handle来处理和service之间来进行交互。消息机制是一种实现进程间通信的最简单的方式,因为所有的请求都会放到一个消息队列当中去进行轮询处理(意思就是单线程啦),每次只处理一个服务请求,这样就不要保证你设计的service需要保证是线程安全状态的。
3.使用AIDL(Android interface definition language 安卓接口定义语言)。:这种方式是最难的一种方式了,他会把所有的工作都会分解成最原始的语义,从而使得系统能够理解该工作目的。然后进行进程间的通信。前面说过message采用的是AIDL的架构基础的,当我们需要同时处理多个请求,而不是放在队列里面一个一个的处理的时候就可以采用这种方式了。使用这种方式你必须保证的你的service能够支持多线程并且保证其实线程安全状态。一般情况下会先创建一个.aldl文件来定义程序的接口,系统会为你自动自动生成抽象类以及IPC的处理,然后你就可以在你的service种进行extend了。
本文此处介绍Binder类,后续的Message 和AIDL机制会慢慢更新上来。
如何创建一个bound service呢?
要素:
必须得实现onBind()函数,然后返回一个IBinder的接口,IBinder定义了与service通信的接口;
其它应用程序通过调用bindService()来绑定到该service上并获取接口以及调用service的方法。
service生存的唯一理由是为了绑定它的应用程序服务,因此,应用程序如果消失了,它也失去了它生存的意义了。好伟大的“爱情”,现实当中我们找不到这样的爱情,代码中找到了,HOHO。
好了,我们来梳理下创建一个bound service的过程:
首先,我们必须得定义一个客户端如何与service通信的接口,该接口必须是实现了IBinder的接口,该接口是从obBind()函数的回调方法中返回来的。一旦客户端收到了IBinder接口,就可以和service间进行通信了。
多个客户端可以和service绑定一次,当客户端与service交互结束之后,将会调用unbindService()来解除绑定,一旦整个系统中没有客户端与service进行绑定了,那么系统将会destory该service。
上个具体的例子并附注说明:
例子实现一个service来项客户端提供一个随机产生的数字功能。客户端将service提供的随机数显示在自己的界面上。
1.LocalService.java类,继承自service,代码以及注释如下:
- package com.android.localboundservice;
- import java.util.Random;
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.util.Log;
- /**
- *
- * @author bluesky
- * 创建一个bindservice 的步骤:
- * 实现一个IBinder接口类,并返回一个IBinder对象,该对象用于传递给客户端来进行调用service的服务。通常的做法是extends Binder类,
- * 应为该类实现了IBinder的接口。然后从onBind函数中返回当前service的一个实例,该实例是IBinder类型。
- * 实现service中需要提供给客户端的服务即可。
- * 至于客户端如何使用service请看客户端的操作。
- */
- public class LocalService extends Service {
- public IBinder localBinder = new MyLocalService();
- public Random m_generator = new Random();
- public static final int num = 2000;
- private static final String TAG = "LocalService";
- /**
- *
- * @author bluesky
- * 该类作用:
- * 1.yLocalService 继承自Binder类,而Binder类是实现了IBinder接口的。该接口用于提供给客户端,
- * 可以用于客户端获取service的对象,然后调用service端的方法。
- */
- public class MyLocalService extends Binder{
- public LocalService getService(){
- Log.d(TAG, "********getService");
- return LocalService.this;
- }
- }
- /**
- * 由于是采用IBinder形式进行service绑定的,这里在绑定的时候我们要返回一个IBinder对象,该对象用于给客户端使用service的服务。
- * 该对象就是前面我们创建的MyLocalService的对象,该对象是继承了Binder类,Binder类实现了IBinder接口。
- */
- @Override
- public IBinder onBind(Intent arg0) {
- // TODO Auto-generated method stub
- Log.d(TAG, "*******return IBinder interface");
- return localBinder;
- }
- /**
- * @param null;
- * @return 随机数。
- * service中提供的方法,用于产生一个随机数。
- */
- public int generatorInt(){
- Log.d(TAG, "******get random generator!");
- return m_generator.nextInt(num);
- }
- }
2 LocalBoundServiceActivity.java继承自Activity作为我们的客户端:
- package com.android.huawei.localboundservice;
- import com.android.localboundservice.LocalService.MyLocalService;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.widget.Button;
- import android.widget.Toast;
- import android.util.Log;
- import android.view.*;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.content.ServiceConnection;
- /**
- *
- * @author bluesky
- * 客户端如何使用binder service
- * 1.在Activity的start的时候使用intent对象启动bindService(Intent intent,ServiceConnection conn,int flags)来进行绑定。
- * bindService的需要传递三个参数:
- * 1 绑定service的intent;
- * 2 ServiceConnection的接口变量,既然是接口,那么我们肯定需要在程序中去实现了。这个变量主要是当service连接和断开的时候传递相关的信息。需要实现两个回调函数
- * 1)onServiceConnected():当连接建立起来的时候,传递由onBind函数中返回的IBinder的接口对象。
- * 2)onServiceDisConnected():当连接异常断开的时候,系统会走到该函数处,比如说service被杀死,或者程序异常崩溃。但是必须记住:客户端调用unbindService()函数的时候
- * 是不会走到该函数处的。调用客户端消亡的时候,service跟着消亡。
- * 3:标记,这里的标记我们选择BIND_AUTO_CREATE表述当bind存在的时候自动创建service。
- *
- */
- public class LocalBoundServiceActivity extends Activity {
- private static final String TAG = "LocalBoundServiceActivity";
- private Button mBtnService = null;
- private boolean isConn = false; //该标记位主要用于判断当前是连接状态呢还是断开状态
- private LocalService recSer = null;//定义一个LocalService变量,该变量继承自Binder类(实现了IBinder接口)
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mBtnService = (Button)findViewById(R.id.bindService);
- /**
- * 该按钮响应函数用于调用service中的随机数生成器。
- */
- mBtnService.setOnClickListener(new Button.OnClickListener(){
- public void onClick(View v){
- if(isConn == true){
- int num = recSer.generatorInt();
- Toast.makeText(LocalBoundServiceActivity.this, "生成数为:"+ num, Toast.LENGTH_LONG).show();
- }
- }
- });
- }
- @Override
- protected void onStart() {
- // TODO Auto-generated method stub
- super.onStart();
- Intent intent = new Intent(LocalBoundServiceActivity.this,LocalService.class);
- bindService(intent,mcoon,Context.BIND_AUTO_CREATE);//绑定服务
- }
- @Override
- protected void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
- if(isConn){
- unbindService(mcoon);
- isConn = true;
- }
- }
- private ServiceConnection mcoon = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // TODO Auto-generated method stub
- isConn = false;
- Log.d(TAG, "service disconnected!!!");
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // TODO Auto-generated method stub
- MyLocalService bindSer = (MyLocalService)service;
- recSer = bindSer.getService();
- isConn = true;
- Log.d(TAG, "service connected!!!");
- }
- };
- }
最后不要忘记在你的manifest文件中加上service的注册:LocalBoundService Manifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.huawei.localboundservice"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="8" />
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".LocalBoundServiceActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <service android:name=".LocalService">
- </service>
- </application>
- </manifest>
程序运行的界面如下:
OK了,结果成功显示出来了。
不知道上面的描述可否说清楚了Bounder service的用法,鄙人其实也查过不少书籍没一本书说的全的,只好自己去查官方文档和参考一些老外的书籍。中文书籍发现是真的没办法看,特别是翻译过来的,很多地方翻译的要么不通顺,要么就是曲解了作者本身的含义。还是推荐大家看英文原版的比较好。
后续会慢慢贴上message和AIDL的service机制,到时候大家一起讨论研究。
文档有不足的地方欢迎大家拍砖,讨论。
原文地址:http://www.linuxidc.com/Linux/2011-09/42255.htm
相关推荐
本文将深入探讨“Android Service之bound实现”,理解如何通过绑定服务(Bound Service)来创建一个与应用程序组件交互的服务。 首先,我们要了解服务的两种基本类型:Start Service和Bound Service。Start Service...
在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,即使用户界面关闭也能继续工作。本篇文章将深入探讨`startService`类型的Android Service,通过一个简单的实例来展示其工作原理和...
Service是Android系统中的一个重要组件,它是应用程序框架的一部分,允许开发者在后台执行长时间运行的操作而无需与用户交互。这篇博客文章将深入介绍Android Service类的基本概念、功能、生命周期以及如何在实际...
在“绑定服务BoundService详解之AIDL的使用”中,我们将了解如何利用AIDL创建自定义的接口,以便在Activity与BoundService之间传递复杂的对象和数据。 首先,我们需要创建一个AIDL文件,例如`IMyService.aidl`,在...
总结来说,理解并熟练运用`startService`和`BoundService`是Android应用开发中的关键技能,尤其是在需要后台运行和交互的场景,如音乐播放。通过合理的组合使用,可以构建出高效、稳定且用户体验良好的应用。
Android服务(Service)是Android操作系统中四个核心应用程序组件之一,其他三个分别是Activity、BroadcastReceiver和ContentProvider,它们在Android应用开发中的作用和使用场景各不相同。Service的作用主要体现在...
在Android开发中,Service是应用程序组件之一,它用于在后台执行长时间运行的操作,即使用户界面不在前台。在本文中,我们将深入探讨如何在Android应用中绑定Service,这通常用于实现客户端-服务器通信,使得应用...
在Android开发中,Service是四大组件之一,它用于在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨四个具体的Service实现案例,帮助开发者更好地理解和应用Service。 案例一:简单服务(Basic ...
首先,`Service`是Android四大组件之一,它在后台执行长时间运行的任务,不与用户界面直接交互。在音乐播放器中,`Service`通常用来维持音乐播放的状态,即使用户离开应用,音乐也能继续播放。创建`Service`需要继承...
在Android系统中,Service主要分为两种类型:Bound Service(绑定服务)和Started Service(启动服务)。在这个例子中,我们关注的是Started Service,因为它适合于执行一个长时间的操作,比如播放音乐。 要创建一...
在Android应用开发中,Service是四大组件之一,它在后台执行长时间运行的操作,不与用户界面直接交互。Service生命周期的理解和正确管理对于优化应用程序性能至关重要。以下是一个关于Service生命周期的详细解析,...
Android 的四大组件之一是 Service,Service 是 Android 中的一种组件,用于在后台运行程序,承担着静悄悄的不为人所注意的工作。Service 可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他 ...
在Android系统中,Service是四大组件之一,它主要用于在后台执行长时间运行的操作,即使用户离开了应用程序,Service仍能持续运行。本篇文章将深入探讨Android Service的基本知识,包括其概念、类型、启动方式、生命...
在Android系统中,Service是一种关键组件,用于在后台执行长期运行的任务,比如音乐播放或后台数据同步。然而,Service并不是一个独立的线程,而是运行在应用程序的主线程上,这意味着如果你在Service中直接执行耗时...
在Android开发中,Service是四大组件之一,它用于在后台长时间运行操作,即使用户界面已经关闭。本项目“android-service的demo”旨在提供一个实践示例,帮助新手理解如何在Android应用中创建和使用Service。参考自...
首先,我们需要理解Android中的绑定服务(Bound Service)和启动服务(Started Service)两种类型。绑定服务允许Activity直接与Service交互,通过接口调用方法来获取数据。启动服务则是在后台执行一个任务,通常不...
在Android开发中,服务(Service)是四大组件之一,它在后台执行长时间运行的操作而不会与用户界面交互。其中,绑定服务(Bound Service)是一种特殊的服务类型,它允许其他组件如活动(Activity)、...
- **定义**: `Service` 和 `Activity` 一样,都是 Android 应用程序的重要组成部分之一。不同之处在于,Service 主要在后台运行,并且不提供用户界面(User Interface, UI)。 - **特性**: Service 可以独立于启动它...
在Android开发中,Service是四大组件之一,它用于在后台执行长时间运行的操作,而不与用户交互。本篇文章将深入探讨如何使用Service实现通话录音功能,参考自博客:...
在Android开发中,Service是应用程序组件之一,它用于在后台执行长时间运行的操作,即使用户界面不在前台。Service常用于处理音乐播放、定时任务或者后台数据同步等任务。本讲解将深入探讨Service的工作原理以及如何...