zoukankan      html  css  js  c++  java
  • android 源码阅读笔记之 Service

    Service的源码中带有大量注释,其中声称service这个东西其实是一个意图简单的组件,主要的两个用途是:用于进行不与用户交互但需要长期保持在后台的操作、或可以共享给其他程序使用的本程序的一些功能。

    Service的启动方式有两种,一种是在context中直接调用startService(), 这样未被创建的服务就会通过onCreate()创建,已创建的跳过,并马上调用onStartCommand()中的操作逻辑。但是有一个缺点是开启服务之后就与活动断开了联系。所以要一直保持服务与活动的信息交流,就需要使用bindService()进行启动,它同样可以创建未初始化的服务,但是不会调用onStartCommand()。为了完成服务于活动的通信,需要写一个Binder的子类作为Service中的一个内部类(这样较简便),然后在service的onBind()中返回一个binder实例,供活动对服务进行操作。而服务中则需要通过实例化并重写一个ServiceConnection类,使得bindService能绑定service并获取binder实例。

    一个要注意的地方是,服务Service并不是一种线程,它是与其他组件一样运行在同一个主线程中的,因此如果其中的耗时操作达到一定限度(大约是20秒),就会出现ANR。所以一般在服务中的耗时操作都要在一个新开(spawn)的线程中进行。而android本身已经有一个范例,那就是继承自Service的IntentService。

    停止服务的方法有两种,一种是在context中使用stopService(),另一种是在service内部的合适位置调用stopSelf()。而如果使用的事intentService,就不需要考虑这一点,只要重写onHandleIntent()完成想要完成的操作逻辑,执行完毕后会自动停止。

     service源码中确实是有onStart(),但是我们在使用service的时候重写的都是onStartCommand(),因为源码中前者被包装在了后者的方法体中,为了能根据模式产生int型返回值。这一功能暂时没有用到。

    此外有一个ActivityManager的对象,用在了stopSelf()、startForeground()中,这个类中有一些对service进行操作的成员方法。

  • 相关阅读:
    2021.02.09 【ABAP随笔】-Excel高效输出工具-xlsx workbench-输出多个Sheet
    2021.02.07 【ABAP随笔】-Excel高效输出工具-xlsx workbench
    Thrift did not exit cleanly
    Docker部署Springboot项目,Invalid or corrupt jarfile /app.jar
    为jenkins设置nginx作为反向代理
    Jenkins安装报错 No valid crumb was included in request
    判断当前设备是ios还是安卓
    vue 路由跳转四种方式 (带参数)
    Vue table的column属性,render函数生成switch开关和button按钮
    H5页面自定义 pxTorem 函数进行单位转换
  • 原文地址:https://www.cnblogs.com/jason31/p/9591820.html
Copyright © 2011-2022 走看看