聊聊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官方的配图,简单直白明了,我就不再赘述了。

image

由于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的实例

image

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

image

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

image

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

image

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

image

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

image

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

相关文章
|
11天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
10天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
355 131
|
10天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
443 131
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
206 138
|
10天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
405 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
4天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
204 136
|
22天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1363 8
|
9天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。