聊聊Service(一)

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的进程间通信的实现。

时间: 2024-07-28 17:31:54

聊聊Service(一)的相关文章

DockOne微信分享(一二九):聊聊Service Mesh:linkerd

本文讲的是DockOne微信分享(一二九):聊聊Service Mesh:linkerd[编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂性,怎么实现微服务间安全,高效,可靠的访问,如何满足多语言多环境的透明通讯,服务发现.熔断,动态流量迁移,金丝雀部署,跨数据中心访问等等.本次分享给大家引入一新概念服务网格(Service Mesh)以及介绍业界

聊聊 Android 的 Service 组件

Android 开发的同学都知道,Android 有四大组件,分别是 Activity.Service.BroadcastReceiver 和 ContentProvider.在这里,我想跟大家聊一聊 Service 组件,我们从头开始,包括什么是 Service?Service 有什么作用?怎么使用它?需要关注哪些性能问题?什么情况下使用它最合适?好,废话少说,马上进入主题. 直译过来,Service 就是服务.它跟 Activity 不同,没有界面,不直接与用户进行交互,是一个可以在后台长时

[转载]聊聊Greenplum的那些事

原文   http://dbaplus.cn/news-21-341-1.html 聊聊Greenplum的那些事 李巍 2016-04-01 14:15:00 1024   开卷有益--作者的话    有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨.   笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum 早期员工加入Greenplum团队(当时的工牌是"005",哈哈),记得当时看了一眼Gree

从 Spring Cloud 开始,聊聊微服务架构实践之路

本文讲的是从 Spring Cloud 开始,聊聊微服务架构实践之路[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数

从架构演进的角度聊聊Spring Cloud都做了些什么?

Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功能对微服务的架构提供了怎样的便利? 这也是我写Spring Cloud三部曲的最后一篇文章,前两面篇内容如下: 中小型互联网公司微服务实践-经验和教训 Spring Cloud在国内中小型公司能用起来吗? 我们先来简单回顾一下

[Java] 利用Axis库调用C#的Web Service

[Java] 利用Axis库调用C#的Web Service 编写者 日期 关键词 郑昀@ultrapower 2005-8-2 Java Web Service Axis C#   概述 试图从Java调用C#编写的Web Service,借用了王咏刚的wsCaller源代码中DynamicInvoker类. 开始不清楚DynamicInvoker类的portName的含义,望文生义,以为是8080之类的端口号,实际上是下面wsdl中的wsdl:port 节点的"name"属性值&q

聊聊内存管理

这篇文章我们聊聊内存管理. 本来我想不针对于任何具体的操作系统来谈内存管理,但是又觉得不接地气.言之无物.所以我决定在阐述概念的同时,还针对IA32平台Linux下的内存管理做简要的介绍,并且以实验来证明结论.以下内容分拆为几个大标题和小节,内容前后承接. 物理地址空间 首先,什么是物理地址空间?我们知道CPU与外部进行信息传递的公用通道就是总线,一般而言,CPU有三大总线:控制总线.数据总线.地址总线.这三类总线在一定程度上决定了CPU对外部设备的控制和数据传送能力.其中地址总线决定了CPU能

service-大神:Android的Service如何实现不被手机清除缓存,而被杀掉

问题描述 大神:Android的Service如何实现不被手机清除缓存,而被杀掉 1.就是实现一个不被干掉的Service.2.我是实现对短信的监听的,使用了静态注册后,退出Activity是可以监听,可是被清除缓存后(长按HOME键位清除),就没有反应了.有没有好的方法? 解决方案 /** * 每次调用startService(Intent)的时候, * 都会调用该Service对象的onStartCommand(Intentintint)方法, * 然后在onStartCommand方法中做

由360手机卫士谈起——让你的service获取最高权限。

近日来,我在倒腾360手机卫士的时候,发现,你无论是把他数据清空,还是把它强行停止以后,甚至是把它卸载以后,它的service都没有被Android的系统干掉,依然是岿然不动了.我就感到了纳闷了,后来和群里的大牛讨论后,才知道360手机卫士真他妈的流氓,它是靠第三方的应用,360手机卫士将其开启.这就引出了,我们今天的话题,说一说service的重启方式,从而获取到最高的权限了. 1. 在service的OnDestroy中重新start service. 正规的stopservice的退出后,