美文网首页
《Service史上最全面解析》理解和补充

《Service史上最全面解析》理解和补充

作者: mfdalf | 来源:发表于2020-11-30 21:49 被阅读0次

    Android 四大组件:activity显示,service后台服务,broadcast通信, contentProvider 数据共享.
    相关系列文章:
    Activity总结和补充:https://www.jianshu.com/p/bd31881c28fc
    Android Binder&Aidl理解和补充:https://www.jianshu.com/p/eb791ae04e2f
    Service史上最全面解析》理解和补充: https://www.jianshu.com/p/444af9739135
    Handler总结和补充:https://www.jianshu.com/p/a041c41af27d

    目录

    image
    《Service史上最全面解析》地址:https://blog.csdn.net/carson_ho/article/details/53160049.
    本文是在读完上面blog之后,对没有完全理解的service内容的补充.

    1. 定义作用特点

    • 作用:提供 需在后台长期运行的服务
      Service不需要界面,提供一种服务.在后台执行耗时的操作.比如:下载文件,数据库操作.

    如:复杂计算、音乐播放、下载等

    • 特点:无用户界面、在后台运行、生命周期长

    2. Service 生命周期

    image

    image2.1 启动和结束
    startService 启动,stopService 结束.
    bindService 绑定service分成两种情况:1):先startService然后bindService.2):如果service已经启动,直接bindService.
    unbind 用于解绑service.
    startSerivce和bindService启动分成两种场景,第一次启动&其他次启动。
    1) startSerivce
    它的生命周期很简单,分别为onCreate、onStartCommand、onDestroy这三个。
    第一次创建Service会回调onCreate()方法,然后回调onStartCommand()方法。
    再次startService()的时候,就只会执行onStartCommand(),不会执行onCreate。
    2) bindService
    使用bindService启动的话执行的方法onCreate--->onbind,而且这种方法启动的话,
    第一次bind service会调用onbind。
    再点击bindService按钮启动服务,onbind方法就不会再执行了。
    2.2 bindService and startservice 区别?

    作用 通信 与调用者关系 结束 特点
    startService 开启service 所有activity都可以bind这个service通信 没有依赖关系.不依赖于启动它的activity,调用者被系统回收或者调用了onDestroy方法,Service还会继续存在 stopService 常驻内存.有些像server的属性
    bindService 绑定Service或者开启并绑定Service 仅仅与调用者通信 有依赖关系。bindService启动的service可以由unbindservice来结束,也可以在Activity结束之后(onDestroy)自动结束.即调用者挂了,service也会跟着挂掉 unbind或者activity退出之后自动结束 有些像client的属性

    小结:两者的区别有两点,第一:能不能通信,第二 如何结束。
    notes: 手机按back键退出,是退出activity,不是app 进程.进程的退出见附录
    2.3 bindService and startservice 连用
    startService常驻后台,不随activity退出而退出。同时activity 可以通过bindService进行通信。
    https://blog.csdn.net/dongbeitcy/article/details/77773467

    3. 类型

    3.1 具体分类

    image

    示意图

    3.2 详细介绍

    image

    3.3 应用场景

    都需要将该服务注册到配置文件AndroidManifest.xml中如何实现远端service.
    1)运行地点
    本地服务(Local Service):用于应用程序内部. 实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。
    远程服务(Remote Sercie):用于android系统内部的应用程序之间.可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。

    1. 运行类型
      前台:比如notify service .后台,比如:download文件
      android自动回收机制可能回收后台service进程。
    2. 功能

    4 service处理耗时操作?(service 主要作用)

    一共有3种方法,service中启动线程处理,intentService和remote service.

    1. local service中启动线程处理
      local service 和activity一样,也是在主线程中,如果在service中处理耗时操作,会影响到主线程,所以在service中启动线程处理.
      为什么不在activity中启动线程?
      既然service也要启动线程,为什么不在activity中启动线程。因为activity退出之后,activity启动的线程就失去控制。
      而service常驻内存,不会因为activity退出而退出,可以一直管理启动的线程.
      notes:父线程退出子线程不会退出.主线程退出导致进程退出,所有线程都会退出。
    2. intentService

    IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题.
    优点:

    • 一方面不需要自己去new Thread
    • 另一方面不需要考虑在什么时候关闭该Service
      实际和方法1)是一样的,只是将方法1)封装完成. 使用方法参见:jianshu.com/p/be97093783d6.
      intentService的原理thread+handle.子线程sendmsg发送,handlemessage接收.
    1. 独立service进程


      image

      QA service,activity和thread关系?
      service是在进程还是线程?
      local service和activity在同一个主线程(UI线程),手机back键会使activity退出,但是service并不退出,整个app进程没有退出.
      remote service是独立进程.
      AndroidManifest
      android:process=”com.xxx.xxxservice”配置到单独的进程中
      android:process=":remote"

    activity 与独立service进程通信,参见后文通信部分。
    notes: service不能处理耗时操作,那么service处理什么呢??

    4 通信

    4.1 activity与local service 通信
    因为两个class在同一个进程 activity直接用service.binder对象,所以可以直接组合。然后binder调用实现函数
    实例参见:https://blog.csdn.net/shaw1994/article/details/43854553
    注意:本地通信在一个进程之内,不需要aidl,不用binder.transact,不用binderProxy.
    仅仅用类的结合,调用binder对象中的业务逻辑函数即可.

    image
    4.2 activity与remote service 通信
    属于跨进程通信,需要使用aidl. 参见:Binder&Aidl https://blog.csdn.net/fdsafwagdagadg6576/article/details/109862316中的aidl部分.
    这里补充一下service 和binder是什么关系?
    两者是组合关系,service类使用binder类. binder对象是service类中的一个成员变量。
    Android中2种方法来获得service IBinder的方法.
    1. bindService
      //binderService 可以在onServiceConnected()里取回这个Service的IBinder引用.
      bindService(intent, serviceConnection , BIND_AUTO_CREATE)
      private ServiceConnection serviceConnection = new ServiceConnection() {
      @Override
      public void onServiceConnected(ComponentName name, IBinder service) {
      iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
      }
      ......
      };
      使用之后,用unbind释放了binder。
    2. getService
      通过ServiceManager.getService(String Descriptor)来获得Service Manager管理的service的IBinder。
      // 从ServiceManager中获取服务; asInterface 关键函数,通过binder获取
      myservice = IMyService.Stub.asInterface(ServiceManager.getService("MYSERVICE"));
      notes:addService向serviceManager中添加service
      小结:两者的获取路线不同。bindService较常用.
      image
      附录1:
      1 关闭进程:
      通过直接杀死当前应用的进程来结束应用,简单粗暴!(不推荐!不推荐!不推荐!!)
      方式一: android.os.Process.killProcess(android.os.Process.myPid());
      方式二: System.exit(0);
      方式三(需要权限: requires android.permission.KILL_BACKGROUND_PROCESSES):
      ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
      manager.killBackgroundProcesses(getPackageName());
      这三种都能达到退出应用的效果。但是部分真机会直接失效,或者只能finish当前Activity,国产ROM改动太多,不建议使用相关方法。
      2 Service manager和service 关系?
      理解为:service是类,service manager管理它。service manager仅仅是注册。startService才负责启动,运行是在主线程中。启动&运行与service manager没关系
      servicemanger 和activitymanagerservice什么关系?
      serviceManager主要功能是:管理系统服务,比如AMS、WMS、PKMS服务等,
      而APP通过的bindService启动的Binder服务其实是由SystemServer的ActivityManagerService负责管理.
      附录2: 参考Android Service完全解析,关于服务你所需知道的一切(上)
      https://blog.csdn.net/guolin_blog/article/details/11952435

    相关文章

      网友评论

          本文标题:《Service史上最全面解析》理解和补充

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