【原创】也来探一探Service

.背景

        以前一直没有尝试过service,原因有两个,第一,自己不懂Service,觉得学习起来麻烦,第二因为自己不懂,所以不知道什么时候要用Service什么时候不用Service。刚好,公司项目中要做关于蓝牙开发的模块和集成即时聊天模块,终于是避无可避。其实也不懂什么时候要用,只是在蓝牙的demo中看见demo使用的Service,后来又改进项目中的聊天模块,发现应该使用Service更好,于是抽空写写学习Service的心得。

 

一,什么是Service

1Service也是和Activity一样,是Android当中的一个常用的控件,其最大的特点是运行在后台,不和用户直接打交道。

2Service也是运行在主线程当中的!!!所以,如果有什么会阻塞主线程或者耗时的操作,那么抱歉,请还是要开个子线程来操作。

 

二,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);它们之间的通信类似于clientserver,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。 

1). ThreadThread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 

2). ServiceService android的一种机制,当它运行的时候如果是Local Service,那么对应的Service 是运行在主进程的 main 线程上的。如:onCreateonStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

4Service方便于管理,而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,生命周期


3The entire lifetime

service整体的生命时间是从onCreate()被调用开始,到onDestroy()方法返回为止。和activity一样,serviceonCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。比如,一个音乐播放service可以在onCreate()中创建播放音乐的线程,在onDestory()中停止这个线程。onCreate()  onDestroy()会被所有的service调用,不论service是通过startService()还是bindService()建立。

 4The 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);


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值