Service作为Android中四大组件之一,拥有重要的地位。Service具有和Activity一样的级别,只是没有界面,是运行于后台的服务。这个运行“后台”是指不可见,不是指在后台线程中,事实上四大组件都是运行在UI线程中,都不能在各自的生命周期方法中执行耗时操作或者网络请求。Service的应用场景还是比较多的,比如说在后台播放音乐、实时去更新当前地理位置的变化、新闻APP后台去离线缓存内容、进程间通信等。

Service主要可以分为两类:Local Service、Remote Service。比较常用的还是本地服务,应用于程序内部。可以通过Context.startService()启动Service,通过Context.stopService()结束服务。同时也可以Context.bindService()来绑定一个service服务自己,也可以通过Context.unbindService()解绑。无论调用多少次startService,只需一句stopService就终结服务了。

Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

启动Service的方式有两种,那对应着的是Service的两种生命周期。看下Google官方的配图,简单直白明了,我就不再赘述了。

由于start和stop的方式来控制服务的方式比较简单,在此也就不多赘述了。只是还需提醒在这种方式下,Activity与Service的通信就显得不那么直白简单了,因为我们拿不到Service的引用。如果你通过单例的形式去拿到Service的引用,进而获取其中的方法和属性也未尝不可,但是入侵性比较严重,在此不推荐大家使用这种办法。比较好的实现Activity和Service之间通信的是另一个重要的组件BroadCastReceiver,下面的实例中会用到。

实战使用的是一个简单的音乐播放器。当然了,使用的是bind和unbind的方式。bind即绑定服务,unbind即解绑服务,也进而调用了Service的onDestroy方法销毁。bind可以直接拿到Service的引用,能直接操控service。bind可以用在当前应用中的业务处理,也可以通过AIDL实现进程间通信。本文先介绍第一种。简单介绍下这个Demo实现的功能,它会播放手机SD卡上的一首歌曲,你可以对其开始和暂停操作,界面会展示歌曲的时长以及歌曲播放的实时位置。两者的交互的实现方式:1、类引用的直接调用 2、广播机制,Service发,Activity接收。

一、在MusicService中新建内部类MyBinder,其中有个公有方法返回Service的实例

二、通过MusicService中的onBind方法返回MyBinder的实例,供Activity绑定成功后的回调

三、和Activity一样,需要在manifest中注册

四、Activity中绑定,获得回调的Binder,进而得到MusicService实例

五、拿到了MusicService的引用了,终于可以操作service去播放暂停音乐了

六、在Activity的onDestroy方法中,记得对Service进行解绑。不然会和注册的BroadCastReceiver一样,会造成内存泄漏

好了,今天的干货分享就到这里了,明天为大家献上基于AIDL和Service的进程间通信的实现。

聊聊Service(一)相关推荐

  1. 聊聊Service Mesh:linkerd

    [编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂 ...

  2. 聊聊 Service 命名与设计

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 Service ...

  3. 聊聊Service Worker

    Web Workers web worker: 为Web内容在后台线程中运行脚本提供了一种简单的方法,线程可以执行任务而不干扰用户界面,即:运行在后台的 JavaScript 浏览器一般有三类 web ...

  4. Service Mesh -- Istio概述

    如果你用过微服务,你就会发现,为了解决引入微服务架构所带来的问题,要不断的引入新的技术:服务注册与发现.链路调用跟踪.性能监控.日志收集等等.微服务架构给我们带来方便的同时也会让系统变得越来越复杂,尤 ...

  5. 图解Istio原理和实践--云平台技术栈18

    " 如果你比较关注新兴技术的话,那么很可能在不同的地方听说过 Istio,并且知道它和 Service Mesh 有着牵扯. 导读:之前发布了云平台技术栈(ps:点击可查看),本文主要说一下 ...

  6. 如何构建一套高性能、高可用性、低成本的视频处理系统?

    点击上方"朱小厮的博客",选择"设为星标" 当当满200减40优惠码「J2KNAE」 来源:阿里巴巴中间件 前言 查看全文 http://www.taodudu ...

  7. Istio 是啥?一文带你彻底了解

    目录 前言 什么是 istio? 什么是 service mesh 再来看 istio istio 解决什么问题 用什么姿势接入 istio? 总结 前言 如果你比较关注新兴技术的话,那么很可能在不同 ...

  8. Istio原理及介绍

    Istio是啥?一文带你彻底了解! 什么是 Istio? 官方对 Istio 的介绍浓缩成了一句话: An open platform to connect, secure, control and ...

  9. 聊聊Spring事务失效的12种场景,太坑人了

    前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要么同时成功,要么同时失败),避免数据 ...

最新文章

  1. bzoj2190 [SDOI2008]仪仗队(欧拉函数)
  2. 设置elf文件链接库的路径
  3. numpy-自定义ufunc函数和广播
  4. 如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏
  5. 迭代器以及迭代器的作用
  6. spring注解-声明式事务
  7. java w732_技术联盟W732系统下载
  8. java 五个数字_关于java:五个任意整数找出其中第二大的数字
  9. Open Sans字体
  10. 测试电脑硬盘损坏的软件,硬盘检测工具哪个好 如何检测硬盘是否损坏【详细介绍】...
  11. 中华名将索引 - 第一批:李世民
  12. js indexOf使用及注意事项以及数组使用indexOf
  13. 今天聊聊电商系统中红包活动设计
  14. 图像压缩之基于神经网络压缩(BP)
  15. 蚂蚁双链通:基于区块链的供应链协作网络
  16. WebRTC 实现P2P音视频通话——搭建信令服务器
  17. 【HCIE考试喜报】2022年11月11日考试通过
  18. 阿里 c语言开发工程师,阿里巴巴2014秋季校园招聘软件研发工程师笔试题
  19. 用 Windows Live Writer完美发布新浪、网易、blogcn、blogbus、cnblogs 博客2
  20. 软件工程技术发展思索

热门文章

  1. 输入输出,数据类型,运算符
  2. 备份MySQL数据库的命令
  3. ie6常见css bug
  4. Ubuntu 14.04 LTS 配置 Juno 版 Keystone
  5. 关于中英数字混排的字符串分割问题(转)
  6. jQuery到底有什么好?
  7. MS SQL SERVER中备份所有数据库
  8. spring中bean的高级属性之list, set, map以及props元素(含举例)
  9. java按行读取byte_【util】MappedByteBuffer按行读取的方案
  10. java求任意个数集合的笛卡尔积,Java中任意集的笛卡尔积