文档章节

聊聊Service(一)

Jack_1900
 Jack_1900
发布于 2014/07/18 22:15
字数 1087
阅读 7519
收藏 164

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

代码地址:https://github.com/JackCho/ServiceDemo1

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享。下面是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。

© 著作权归作者所有

Jack_1900
粉丝 225
博文 35
码字总数 34078
作品 1
普陀
程序员
私信 提问
加载中

评论(24)

weicai
weicai
伟才,点个赞
Jack_1900
Jack_1900 博主

引用来自“小二在江湖”的评论

楼主,我现在应用中只有service,要实现开机自启动,应该怎么实现呢。我是按照网上很多说法接收广播后,然后启动service,可是实现不了。据说andorid 3.1以后就不支持那样做了,现在要怎样才能实现开机自启动呢。

急,在线等。谢谢!
不会吧,你监听到了开机广播没?一步步查下去,一般开机自启动都是这么个思路搞的
小二在江湖
小二在江湖
楼主,我现在应用中只有service,要实现开机自启动,应该怎么实现呢。我是按照网上很多说法接收广播后,然后启动service,可是实现不了。据说andorid 3.1以后就不支持那样做了,现在要怎样才能实现开机自启动呢。

急,在线等。谢谢!
岚风暴
而且bindService成功后也不是啥事没有的. 特别在息屏后, 再次启动时, 有可能后台service被系统kill了. 所以还要做好service防杀的准备. 这点在local service和remote service中都是一样的
岚风暴
其实还有些细节没说到, 我之前开发时候有遇到.
由于bindService方法是非阻塞的, 所以在bindService之后如果调用service中的一些方法会出现null point.
比如一个Fragment, 在onAttach中bindService后, 在onViewCreate调用service的方法的话会出现null point.
虽然是个小细节. 不过我估计刚学的肯定都会遇到
wenwill
wenwill
2good
倪妲烨
倪妲烨
学习,学习、、各位大神多弄些好文出来分享吧
TerryMa
TerryMa

引用来自“TerryMa”的评论

楼主用的是什么字体,不错啊~可以告诉一下我吗?

引用来自“优雅先生”的评论

YaHei Consolas,需要自己去网上下载这个字体。如果直接用Consolas,英文代码没问题,中文会显得比较小。Consolas是一种常见的等宽编程字体。
好的,谢谢,我试试
TerryMa
TerryMa

引用来自“TerryMa”的评论

楼主用的是什么字体,不错啊~可以告诉一下我吗?

引用来自“Jack_1900”的评论

这个嘛,我也没注意字体样式看,你一说我倒是也觉得蛮好看的。我是在微信后台编辑的,然后copy过来的。如果有兴趣,可以关注我的微信公众账号“Android干货分享”
谢谢
独孤影
独孤影

引用来自“TerryMa”的评论

楼主用的是什么字体,不错啊~可以告诉一下我吗?

是mono么?
聊聊kubernetes[2]——对Nodes、Service、Pods的理解

聊聊kubernetes——对Nodes、Service、Pods的理解 kubernetes学习笔记,分享出来,希望能帮助一些有需要的人,有问题一起交流。 1. kubernetes组件的简单说明 kubernetes中有很多的组件,比如...

cying
2018/07/19
0
0
RMI原理及实现

聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出S...

陶邦仁
2016/03/10
1K
3
聊聊服务架构_Index

聊聊服务架构 Web Service研究分析 深入浅出SOA思想 微服务、SOA 和 API对比与分析

陶邦仁
2016/05/19
1K
0
聊聊EurekaHealthCheckHandler

序 本文主要研究一下EurekaHealthCheckHandler HealthCheckHandler eureka-client-1.8.8-sources.jar!/com/netflix/appinfo/HealthCheckHandler.java netflix的eureka-client提供了HealthChe......

go4it
2018/04/30
156
0
聊聊并发系列_Index

聊聊并发系列 聊聊并发(一)深入分析Volatile的实现原理 聊聊并发(二)Java SE1.6中的Synchronized 聊聊并发(三)Java线程池的分析和使用 聊聊并发(四)深入分析ConcurrentHashMap 聊聊并...

陶邦仁
2016/01/04
648
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
868
10
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部