【原创】也来探一探Service

来源:互联网 发布:淘宝店铺复核认证方法 编辑:程序博客网 时间:2024/06/05 08:16

.背景

        以前一直没有尝试过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() { @Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubmService = null;} @Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubmService = IBindService.Stub.asInterface(service);}};


貌似现在的主流写法是这样。下面的代码的bindService method执行之后会自动调用上面ServiceConnection接口里的onServiceConnected method 

Intent intent = new Intent(IBindService.class.getName());bindService(intent, conn, BIND_AUTO_CREATE);


 

 

 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有公租房的再婚怎么办 廉租房被没收了怎么办 商铺到期房东不续租怎么办 天津集体户口买不起房怎么办 房东不想续租了怎么办 唯一住房卖掉后户口怎么办 杭州唯一住房卖掉后户口怎么办 唯一一套住房卖掉户口怎么办 房租押金条丢了怎么办 二建证书跟毕业证丢失怎么办 住宅房到70年怎么办 护照号变了机票怎么办 苹果se指纹坏了怎么办 月经推迟怎么办才能快点来 车载支架不粘了怎么办 otpc平板电脑无法开机怎么办 手表表轴掉了怎么办 鸡肉放冰箱臭了怎么办 鸡胸肉熟了腥怎么办 梦幻西游手游手机号换了怎么办 ppt做一半卡住了怎么办 吃了发霉的蚝油怎么办 蛋皮干燥起皮怎么办 wps卡顿资料没保存怎么办 手指受伤肉掉了怎么办 手机被wifi禁了怎么办 母乳一边是咸的怎么办 tcl电视蓝频了怎么办 长虹电视蓝频了怎么办 电视突然蓝频了怎么办 海信电视蓝频了怎么办 连网电视蓝频了怎么办 英雄联盟画面卡顿怎么办 长残了怎么办原来很帅 被吓到了怎么办没精神 宝宝吓着怎么办最有效 4个月婴儿易惊吓怎么办 心里有问题的人怎么办 减肥的时候想吃东西怎么办 大联盟ping很高怎么办 酷派手机弹广告怎么办