零.背景
以前一直没有尝试过service,原因有两个,第一,自己不懂Service,觉得学习起来麻烦,第二因为自己不懂,所以不知道什么时候要用Service什么时候不用Service。刚好,公司项目中要做关于蓝牙开发的模块和集成即时聊天模块,终于是避无可避。其实也不懂什么时候要用,只是在蓝牙的demo中看见demo使用的Service,后来又改进项目中的聊天模块,发现应该使用Service更好,于是抽空写写学习Service的心得。
一,什么是Service
1,Service也是和Activity一样,是Android当中的一个常用的控件,其最大的特点是运行在后台,不和用户直接打交道。
2,Service也是运行在主线程当中的!!!所以,如果有什么会阻塞主线程或者耗时的操作,那么抱歉,请还是要开个子线程来操作。
二,Service与子线程或者Thread的区别
Service与子线程或者Thread有什么区别,为什么我们使用的是Service而不是Thread呢?这也是为什么我之前一直未使用Service的主要原因。
1,正如上面所说,Service是运行在主线程的,可能会引起阻塞等情况,这个也算是区别之一吧。
下面的几条不是原创,而是引用别人的,自己水平有限,见谅。(http://www.cnblogs.com/perfy/p/3820502.html)
2.服务不是单一的进程。服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中。
3.服务不是线程。可以在线程中工作。
3.1在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,
使用服务。同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。
3.2如果任务占用CPU时间多,资源大的情况下,要使用线程。
servie是系统的组件,它由系统进程托管(servicemanager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。
1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。
4,Service方便于管理,而Thread不便于管理。Service可以通过两种方法进行启动和销毁,而Thread只能自己在Run方法中看什么时候自己结束。所以如果当一个Activity被销毁,你也想让后台服务也被销毁,那么请使用Service吧。
三,说一说Service的生命周期。
(http://www.cnblogs.com/mengdd/archive/2013/03/24/2979944.html)
说道Service的生命周期,那么就不得不谈谈Service的启动方式。两种启动方式对应了不同的生命周期。
1,启动方式
1.1A started service
被开启的service通过其他组件调用 startService()被创建。这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。
1.2A bound service
被绑定的service是当其他组件(一个客户)调用bindService()来创建的。客户可以通过一个IBinder接口和service进行通信。客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
2,生命周期
3,The entire lifetime
service整体的生命时间是从onCreate()被调用开始,到onDestroy()方法返回为止。和activity一样,service在onCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。比如,一个音乐播放service可以在onCreate()中创建播放音乐的线程,在onDestory()中停止这个线程。onCreate() 和 onDestroy()会被所有的service调用,不论service是通过startService()还是bindService()建立。
4,The active lifetime
service积极活动的生命时间(active lifetime)是从onStartCommand() 或onBind()被调用开始,它们各自处理由startService()或 bindService()方法传过来的Intent对象。如果service是被开启的,那么它的活动生命周期和整个生命周期一同结束。如果service是被绑定的,它们它的活动生命周期是在onUnbind()方法返回后结束。
注意:尽管一个被开启的service是通过调用 stopSelf() 或 stopService()来停止的,没有一个对应的回调函数与之对应,即没有onStop()回调方法。所以,当调用了停止的方法,除非这个service和客户组件绑定,否则系统将会直接销毁它,onDestory()方法会被调用,并且是这个时候唯一会被调用的回调方法。
四,关于回调
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = IBindService.Stub.asInterface(service);
}
};
貌似现在的主流写法是这样。下面的代码的bindService method执行之后会自动调用上面ServiceConnection接口里的onServiceConnected method
Intent intent = new Intent(IBindService.class.getName());
bindService(intent, conn, BIND_AUTO_CREATE);