zoukankan      html  css  js  c++  java
  • Android学习手札-Service探究(LocalService)

    前言:

    一直觉得自己对Service的理解有些迷迷糊糊的,而这个也是程序员的大忌,记得以前看老罗的源码解析中,他说过这样一句话:一知半解就是不懂。所以自己也看了一些Service相关的文章以及源码之后,打算把Service应用中的一些知识梳理一下。

     

    正文:

    本文我将以提问和解答的方式来梳理Service的一些知识。

    对于Service的基础应用的相关操作流程在这里就不再赘述了,你可以去Android官方网站上查看并学习这些内容。

    那么第一个问题,多次调用startService()和bindService()方法是否会启动多个Service的实例呢?

    答:不会,无论是通过bindService()还是startService()启动Service,只要Service当前是启动状态,那么后面调用bindService()还是startService()方法都不会再次创建Service实例了,除非之前创建的Service被关闭,那么再次调用bindService()或者startService()将会重新创建Service;

     

    startService()和bindService()是否可以混用?它们有什么特性?

     

    答:startService()和bindService()可以混用,无论是先调用startService()再调用bindService()还是先调用bindService()再调用startService(),Service的特性是一样的。它将和startService启动的Service一样,在没有调用stopSelf()或者stopService()这个方法之前将一直运行,不过这里要注意一点,就是在调用stopSelf()或者stopService()方法停止Service之前要确保当前Service上没有绑定的对象,也就是说通过bindService()绑定到Service上的对象都已经通过unbindService()解除绑定了,不然调用stopSelf()或者stopService()将无法停止当前的Service;

     

    onRebind()有什么特点?在什么情况下才会被调用?

     

    答:onRebind()方法的API说明表达的意思是,绑定到Service上的对象解绑之后,再次绑定到Service上的时候将调用onRebind方法。再次需要特别提一下的是,如果我在onUnbind()方法中返回的是false,那么在对象绑定到Service上之后解绑,再次绑定的时候,将无法绑定到Service上,无论是bind()方法还是onRebind()方法都没有被调用,如果onUnbind()方法返回的是true,那么再次绑定的时候才会调用onRebind()方法,bind()方法不会被调用。

     

    讨论Service在进程内有哪些应用场景?

     

    答:Service在进程内可以用作持有一些需要长时间存在的全局对象的持有者,例如一些需要全局共享的数据类;不过这个功能由Application来承担会更好一些,因为可以绑定到Service上的对象只能是ContextWrapper的子类,而Application则可以实现单例模式。

    再来就是执行一些调用比较频繁的任务,例如网络通信,音频播放,这任务可以在Service中单开线程来执行。

     

    startService()和bindService()启动的Service有什么特点?

     

    答:startService()的启动流程:onCreate()->onStartCommand()->onStart();通过这种方法启动的Service将会长期运行,直到调用stopSelf()或者stopService();

    bindService()的启动流程:onCreate()->onBind();通过这种方法启动的Service只有在绑定到这个Service上的所有对象都解除绑定之后,那么这个Service将终止运行;

     

    onServiceDisconnected()方法在什么情况下被调用?

     

    答:onServiceDisconnected()方法在我最初的理解里,是认为它在onUnbind()方法被调用之后执行的,实际测试的时候,它并没有在onUnbind()方法调用之后被执行,仔细查看这个方法的API说明的时候,表示这个方法是在一个绑定到这个Service上的Connection丢失的时候才会调用这个方法。例如:Service被系统Kill掉了;

    注意:在Service的onDestory()方法被调用之后,这个方法并不会被执行。而且你如果这个时候你持有Service的实例,你还是可以调用它的方法的。这块的内容需要更加详细的测试来探索它内部的一些机制。

     

    总结:LocalService和绑定对象之间的方法调用和数据传递其实都和调用本地对象一样,这种Service的使用还是相对比较简单的。

  • 相关阅读:
    Java虚拟机--编译那点事儿
    Java虚拟机--常用Java命令(二)
    Java虚拟机--常用Java命令(一)
    Java虚拟机--类加载机制
    Java虚拟机--JIT编译器
    Java虚拟机--垃圾回收机制
    Java虚拟机--对象模型
    Junit测试--多个测试接口如何产生业务联系
    Java虚拟机--内存模型
    Java虚拟机--内存结构
  • 原文地址:https://www.cnblogs.com/lupiniii/p/5315033.html
Copyright © 2011-2022 走看看