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
相关文章推荐
- Android Binder机制浅析之注册MediaPlayerService(1)
- Android Binder机制浅析之ServiceManager
- 浅析android通过jni控制service服务程序的简易流程
- Android Binder机制浅析之ServiceManager
- 《深入理解Android 卷1》读书笔记 (一)—— Android Init 浅析之从Main开始到service start
- 浅析android通过jni控制service服务程序的简易流程
- 浅析android通过jni控制service服务程序的简易流程
- Android之IntentService源码浅析
- 【Android】 context.getSystemService()浅析
- Android应用程序管理服务启动过程浅析(PackageManagerService)
- Android context.getSystemService()浅析
- Android中Intent,service,broadcast应用浅析(一) 推荐
- 浅析android通过jni控制service服务程序的简易流程
- Android中远程Service浅析
- Android 中service的浅析
- Android Binder机制浅析之注册MediaPlayerService(2)
- Android Service 浅析
- 浅析android通过jni控制service服务程序的简易流程
- Android Service 浅析(生命周期,启动方式,前台Service)
- android IntentService浅析