聊聊Service(一)

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

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一样,会造成内存泄漏

 

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

本文链接:http://my.oschina.net/u/1171391/blog/292672

责任编辑:chenqingxiang 来源: oschina
相关推荐

2014-07-31 10:57:15

Android组件Service

2023-12-06 08:26:19

Service数据库

2021-12-10 18:19:14

授权 Linkerd策略

2020-05-06 22:07:53

UbuntuLinux操作系统

2021-06-21 14:52:45

磁盘机械磁盘固态磁盘

2021-02-04 15:08:37

Vue渐进式框架

2021-06-08 06:13:16

React开发开发技术

2021-08-27 07:06:10

IOJava抽象

2023-07-31 07:48:43

Java内存虚拟机

2022-12-07 09:01:14

布局容器VStack​

2024-02-20 21:34:16

循环GolangGo

2023-08-04 08:20:56

DockerfileDocker工具

2023-09-21 08:05:49

Mybatis插件开发

2023-09-10 21:42:31

2023-08-10 08:28:46

网络编程通信

2023-09-21 08:16:56

JDK 21向量计算计算

2022-05-24 08:21:16

数据安全API

2023-06-30 08:18:51

敏捷开发模式

2020-11-25 07:43:07

Java

2021-11-05 07:59:25

HashMapJava知识总结
点赞
收藏

51CTO技术栈公众号