Service--学习笔记

作者: Kevin_Curry | 来源:发表于2016-03-15 18:09 被阅读182次

    1.分类

    按运行地点

    本地服务(Local)  该服务依附在主进程上,

    优点  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。

    缺点  主进程被Kill后,服务便会终止。

    远程服务(Remote)  该服务是独立的进程,

    优点 独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。

    缺点 该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。


    按运行类型

    前台服务

    后台服务

    按使用方式

    startService 启动的服务

    bindService 启动的服务

    2、Service 与 Thread 的区别

    1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的run 方法没有执行完毕的话,Thread 也会一直执行

    2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是RemoteService,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!

    3.什么是intentService?intentService和service区别?

    异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。

    IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去执行你的耗时操作。service提供了一个方法 onStartCommand 当service启动或被调用时候会执行这个方法。

    4.IntentService有以下特点:

    (1)  它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

    (2)  创建了一个工作队列,来逐个发送intent给onHandleIntent()。

    (3)  不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

    (4)  默认实现的onBind()返回null

    (5)  默认实现的onStartCommand()的目的是将intent插入到工作队列中

    5. startService 和bindService有什么不同?

      生命周期不同;


      执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService                       Service会一直在后台运行,下次调用者再起来仍然可以stopService。

      执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在       了  (如Activity被finish了),Service就会调用onUnbind->onDestroy。这里所谓的绑定在一起就是说两者共存亡了。

      使用场景不同;

    1.通过startservice开启的服务.一旦服务开启, 这个服务和开启他的调用者之间就没有任何的关系了.

      调用者不可以访问 service里面的方法. 调用者如果被系统回收了或者调用了ondestroy方法, service还会继续存在

    2.通过bindService开启的服务,服务开启之后,调用者和服务之间 还存在着联系 ,

      一旦调用者挂掉了.service也会跟着挂掉 .

    两种状态可以共存

    1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。

    2). 被绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。

    3). 被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。

    4). 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。

    怎么保证Service不被杀死?

    http://blog.csdn.net/mad1989/article/details/22492519

    启动过程主要从ContextWrapper的startService开始;

    mBase的类型是ContextImpl;

    startService方法会调用startServiceCommon

    startServiceCommon方法又会通过ActivityManagerNativie.getDefault();这个对象来启动一个服务;

    启动过程

    绑定过程

    PS图片来源于网络

    相关文章

      网友评论

      本文标题:Service--学习笔记

      本文链接:https://www.haomeiwen.com/subject/xjwxlttx.html