Android中的Service浅析

来源:互联网 发布:日本强大知乎 编辑:程序博客网 时间:2024/06/06 01:05

大家都知道,Android应用中包括四大组件,分别是Activity、Service、BroadcastReceiver和ContentProvider,那今天就来说一说服务——Service

如果说Activity是一个应用程序的脸面的话,那么Service就可以看做是应用的内在。为什么这么比喻呢,Activity主要负责与用户进行交互的动作,例如更新UI,响应用户点击等,而Service则处理一些用户看不到的事情,比如播放一段背景音乐,发送一个非常耗时的网络请求等。下面就简单介绍一下Service的一些特性。

一、Service的两种启动方式

这两种启动方式,分别是启动和绑定方式(startService和bindService)

1.启动的服务 Started Service

通过客户端,通常是一个Activity,调用startService即可启动一个服务,我们称之为StartedService,或者是UnboundService。

Intent intent = new Intent(MainActivity.this, MusicService.class);startService(intent);
public class MusicService extends Service {    @Override    public IBinder onBind(Intent intent) {        Log.i("tag", "MusicService onBind");        return null;    }    @Override    public void onCreate() {        Log.i("tag", "MusicService onCreate");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.i("tag", "MusicService onStartCommand");        return super.onStartCommand(intent, flags, startId);    }}

2.绑定的服务 Bound Service

通过客户端调用bindService即可将此客户端与一个Service绑定,不过要注意,bindService方法中需要传入一个ServiceConnection实例,来监测服务绑定成功或者失败。

    Intent intent = new Intent(MainActivity.this, LocalService.class);    bindService(intent, connection, Context.BIND_AUTO_CREATE);    // ServiceConnection实现类对象connection用于监测service的绑定情况    ServiceConnection connection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            Log.i("tag", "服务绑定成功");            LocalService.MyBinder binder = (LocalService.MyBinder)iBinder;            LocalService service = binder.getService();  //获取到LocalService实例        }        @Override        public void onServiceDisconnected(ComponentName componentName) {            Log.i("tag", "服务绑定失败");        }    };
public class LocalService extends Service {    @Override    public IBinder onBind(Intent intent) {        return new MyBinder();    }    @Override    public boolean onUnbind(Intent intent) {        return super.onUnbind(intent);    }    class MyBinder extends Binder {        LocalService getService() {            return LocalService.this;        }    }}

三、两种方式的关系

1.service通过startService启动之后,就会独立的运行,与客户端Activity无关,Activity的存在与否不影响service的运行。只有当客户端调用stopService()或者其本身调用stopSelf()时,service才会停止,然后系统将其销毁

2.通过bindService将 activity与service绑定之后,客户端(activity)可以通过一个IBinder接口与service通信。当activity结束的时候,需要手动调用unbindService解除与service的绑定。一个service可以与多个客户端绑定,当所有客户端都解除绑定后,系统将会销毁service。

3.这两种方式并不是完全独立的,一个service被startService启动之后,也可以被客户端绑定。这时如果调用stopService或者stopSelf,系统并不会销毁service,除非所有客户端都解除与此service的绑定。

二、Service的生命周期

一、独立的生命周期,看图说话

这里写图片描述

可以看出Unbound Service与BoundService的生命周期是有所不同的。

1.当调用startService或者bindService时,service都会首先执行onCreate方法,通常在这里做一些初始化的工作。当一个service将被系统销毁时,都会调用其onDestroy方法。例如音乐播放服务,可以再onCreate里面初始化播放器,在onDestroy中结束播放并释放此播放器。

2.两种方式真正活动的生命周期函数略有不同。

  • 启动的服务:从onStartCommand()接收并处理startService传递过来的intent,并在客户端调用stopService或者服务本身调用stopSelf结束
  • 绑定的服务:从onBind()接收并处理bindService传递过来的intent,并在客户端调用unbindService时结束

虽然将这两种方式的生命周期有所不同,但要记住,任何一个service都是可以通过客户端调用bindService方法与之绑定的。

还拿音乐服务来讲,客户端通过startService启动一个服务来播放音乐。当客户端想获取到播放进度,或者对播放进行控制时,可以通过bindService与之绑定然后进行通信。

二、启动并且绑定的服务生命周期

看图说话

这里写图片描述
简单一句话来说,一个既被启动又被绑定的service,只有当所有与之绑定的client全部解除绑定,并且调用stopService或者stopSelf,系统才会销毁此服务。

参考:http://www.cnblogs.com/mengdd/archive/2013/03/24/2979944.html
示例源码:https://github.com/ericzhaowei/KindService/tree/master

0 0
原创粉丝点击