您的位置:首页 > 移动开发 > Android开发

Android中的Service浅析

2016-10-14 08:54 176 查看

大家都知道,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: