当前位置: 首页 > news >正文

【Android】Service

文章目录

      • 1.service
      • 2.startService
      • 3.bindService
      • 4.区别

1.service

在Android开发中,Service 是一个可以在后台长时间运行的组件,用于执行耗时操作或执行那些不需要与用户界面直接交互的任务。Service 不依赖于用户界面,即使用户切换到其他应用,Service 仍然可以继续运行。

Service 的主要用途

  • 后台任务:执行耗时操作,如下载文件、播放音乐等。
  • 跨进程通信:通过 AIDL 实现跨进程通信(IPC)。
  • 定时任务:定期执行某些任务,如定时同步数据。
  • 保持连接:维持与服务器的长连接,如实时聊天应用。

Service生命周期

在这里插入图片描述

  • onCreate():当 Service 第一次被创建时调用。
  • onStartCommand(Intent intent, int flags, int startId):每当通过 startService() 方法启动 Service 时调用。
  • onBind(Intent intent):每当通过 bindService() 方法绑定到 Service 时调用。
  • onUnbind(Intent intent):当所有客户端都解除绑定时调用。
  • onDestroy():当 Service 被销毁时调用。

2.startService

循环打印日志Service:

public class MyService extends Service {private static final String TAG = "ning";private ExecutorService executorService;@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "MyService onCreate");// 创建一个单线程的ExecutorServiceexecutorService = Executors.newSingleThreadExecutor();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "MyService onStartCommand");// 提交一个任务到线程池,周期性地打印日志executorService.submit(() -> {while (true) {Log.d(TAG, "MyService logging at " + System.currentTimeMillis());try {Thread.sleep(1000); // 每秒打印一次日志} catch (InterruptedException e) {e.printStackTrace();}}});return START_STICKY; // 服务被系统杀死后自动重启}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "MyService onDestroy");// 关闭线程池if (executorService != null) {executorService.shutdownNow();}}@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "MyService onBind");return null;}
}

在这里插入图片描述

3.bindService

public class ServiceBindActivity extends AppCompatActivity {private Button btn_bind;private Button btn_cancel;private Button btn_status;private static final String TAG = "ning";private MyBindService myBindService;private boolean isBound = false;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, "onServiceConnected");MyBindService.LocalBinder binder = (MyBindService.LocalBinder) service;myBindService = binder.getService();isBound = true;// 调用 Service 的方法myBindService.doSomething();}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.d(TAG, "onServiceDisconnected");isBound = false;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_service_bind);btn_bind = findViewById(R.id.btn_bind);btn_cancel = findViewById(R.id.btn_cancel);btn_status = findViewById(R.id.btn_status);Intent intent = new Intent(this, MyBindService.class);btn_bind.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 绑定 ServicebindService(intent, connection, Context.BIND_AUTO_CREATE);}});btn_cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 解绑 ServiceunbindService(connection);}});btn_status.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取 Service 状态Log.d(TAG, "Service status: " + (myBindService == null ? "null" : "not null"));}});}@Overrideprotected void onDestroy() {super.onDestroy();// 解绑 Serviceif (isBound) {unbindService(connection);isBound = false;}}
}
public class MyBindService extends Service {private static final String TAG = "ning";private final IBinder binder = new LocalBinder();public class LocalBinder extends Binder {MyBindService getService() {return MyBindService.this;}}@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "MyBoundService onCreate");}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "MyBoundService onBind");return binder;}@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, "MyBoundService onUnbind");return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "MyBoundService onDestroy");}public void doSomething() {Log.d(TAG, "MyBoundService doSomething called");}
}

4.区别

在 Android 中,startServicebindService 都是用来启动和管理 Service 的方法,但它们的使用场景和行为有所不同。下面是它们的主要区别和使用场景:

startService

功能

  • 启动型 Service:通过 startService 方法启动的 Service 是启动型 Service,主要用于执行一次性的后台任务,如下载文件、上传数据等。
  • 生命周期Service 会一直运行,直到它自己调用 stopSelf 方法或者外部调用 stopService 方法将其停止。
  • 回调方法:主要使用 onStartCommand 方法来处理启动请求。

使用场景

  • 后台任务:执行耗时操作,如下载文件、上传数据、处理大量数据等。
  • 定时任务:定期执行某些任务,如定时同步数据。
  • 无需与 Service 交互:不需要与 Service 进行持续的通信,只需要启动 Service 并让它完成任务。

示例代码

// 启动 Service
Intent intent = new Intent(this, MyStartedService.class);
startService(intent);// 停止 Service
stopService(intent);

bindService

功能

  • 绑定型 Service:通过 bindService 方法启动的 Service 是绑定型 Service,主要用于组件之间的交互,如 ActivityService 之间的数据交换。
  • 生命周期Service 会一直运行,直到所有绑定的客户端都解除绑定。当最后一个客户端解除绑定时,Service 会调用 onUnbind 方法,并最终调用 onDestroy 方法。
  • 回调方法:主要使用 onBind 方法来返回一个 IBinder 对象,用于客户端与 Service 之间的通信。

使用场景

  • 持续交互:需要与 Service 进行持续的通信,如播放音乐、实时数据更新等。
  • 跨进程通信:通过 AIDL 实现跨进程通信。
  • 资源共享:多个组件共享同一个 Service 的资源。

示例代码

// 定义 ServiceConnection
private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d("TAG", "onServiceConnected");LocalBinder binder = (LocalBinder) service;myBoundService = binder.getService();isBound = true;// 调用 Service 的方法myBoundService.doSomething();}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.d("TAG", "onServiceDisconnected");isBound = false;}
};// 绑定 Service
Intent intent = new Intent(this, MyBoundService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);// 解绑 Service
if (isBound) {unbindService(connection);isBound = false;
}

总结

  • startService

    • 用于启动一次性的后台任务。
    • Service 会一直运行,直到显式停止。
    • 主要使用 onStartCommand 方法处理任务。
    • 适用于不需要与 Service 进行持续通信的场景。
  • bindService

    • 用于组件之间的持续交互。
    • Service 的生命周期与绑定的客户端相关,当所有客户端解除绑定时,Service 会停止。
    • 主要使用 onBind 方法返回 IBinder 对象进行通信。
    • 适用于需要与 Service 进行持续通信的场景。

相关文章:

【Android】Service

文章目录 1.service2.startService3.bindService4.区别 1.service 在Android开发中,Service 是一个可以在后台长时间运行的组件,用于执行耗时操作或执行那些不需要与用户界面直接交互的任务。Service 不依赖于用户界面,即使用户切换到其他应…...

2-142【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真

【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真,具有14页文档。假设发射信号载频为1GHz,圆形阵列半径为0.8米,在圆周上均匀布置30个阵元。1.画出指向0度的方向图。2.如果目标在0度,有一不相干的干扰信号在3…...

在目录中按扩展名分类文件(python学习)(11.1)

# -*- coding:utf-8 -*- # FileName :SortBySuffix.py # Time :2024/11/1 15:13 # Author :liyiwei# Python脚本按扩展名在目录中对文件进行排序 import os from shutil import movedef sort_files(directory_path):# 遍历指定目录下的所有文件和文件夹for filename i…...

【网络安全 | 漏洞挖掘】逻辑漏洞+无限制爆破实现业务瘫痪

未经许可,不得转载。 文章目录 前言正文前言 目标:target.com,是一个为设计团队服务的工作平台。 该程序允许用户创建账户并组建团队,指定的领导者担任管理员。团队类型包括: 1、免费团队:限于一个项目,最多三份文件。 2、学生团队:项目和文件无限制,学生可免费获…...

【WRF工具】MPAS(多尺度预测模型)-输出WRF初始和横向边界条件

【WRF工具】MPAS(多尺度预测模型)-输出WRF初始和横向边界条件 MPAS概述模型概述主要特点 使用MPAS输出WRF初始和横向边界条件参考 从WPS的v3.9版本开始,metgrid.exe程序能够从 跨尺度预测模型(The Model for Prediction Across Sc…...

分数阶傅里叶变换与信息熵怎么用于信号处理?

天马行空的理解与思考方式:分数阶傅里叶变换与信息熵怎么用于信号处理? ChiX-Y 快速学习,快速尝试,快速失败 已关注 35 人赞同了该文章 这篇文章希望能写的有趣,同时有质量,学习就是要多维度多角度&…...

web3.0 开发实践

优质博文:IT-BLOG-CN 一、简介 Web3.0也称为去中心化网络,是对互联网未来演进的一种概念性描述。它代表着对现有互联网的下一代版本的设想和期望。Web3.0的目标是通过整合区块链技术、分布式系统和加密技术等新兴技术,构建一个更加去中心化…...

【华为HCIP实战课程三十】中间到中间系统协议IS-IS路由渗透及TAG标识详解,网络工程师

一、路由泄露 1、默认情况Level 1不会学到Level2的明细路由,L2可以学到L1的明细路由 2、FIB数据转发,路由负载,通过随机数据中的五元组hash,hash值决定数据走哪条链路 R1设备ping和telnet通过抓包查看走的都是S1/0/0接口 抓包进行过滤;ip.a…...

大模型论文精华-20241104

工具而不是对等:框架如何影响人们对 Teams 中 AI 代理的看法 研究问题 随着人工智能技术的发展及其在团队环境中日益广泛的应用,人们对于如何理解和评价AI代理的态度和看法变得尤为重要。该研究关注于探讨不同框架下人们对AI代理的感知差异&#xff0c…...

mac ssh 连接 linux 服务器

生成 SSH 密钥对 打开终端: 你可以通过 Spotlight 搜索 “Terminal” 打开终端。 生成密钥对: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 手动复制公钥(可选) 如果 ssh-copy-id 命令不可用&#xff0…...

逻辑卷建立

逻辑卷 lvm逻辑卷即为:logical volume manager逻辑管理卷,是linux系统下管理硬盘分区的一种机制,lvm适合于管理大型存储文件,用户可以动态的对磁盘进行扩容 作用 lvm:linux系统的一个重要的存储技术 不同的硬盘的不…...

算法深度剖析:前缀和

文章目录 前言一、一维前缀和模板二、二维前缀和模板三、寻找数组的中心下标四、除自身以外数组的乘积五、和为 K 的子数组六、和可被 K 整除的子数组七、连续数组八、矩阵区域和 前言 本章将深度剖析前缀和,以及总结前缀和模板。 前缀和是一种在算法和数据处理中…...

【双目视觉标定】——1原理与实践

0 前言 双目视觉定位是目前机器(机器人)等领域中使用得非常广泛的视觉定位技术,双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算,所以双目相机装配要求…...

Java学习笔记(十二)

Mysql explain Extra MySQL的EXPLAIN语句是优化数据库查询的重要手段,其中的Extra列包含了不适合在其他列中显示但十分重要的额外信息。以下是对Extra列的详细介绍及举例: 一、Using filesort 解释:表示MySQL会对数据使用一个外部的索引排序…...

《Java 实现希尔排序:原理剖析与代码详解》

目录 一、引言 二、希尔排序原理 三、代码分析 1. 代码整体结构 2. main方法 3. sort方法(希尔排序核心逻辑) 四、测试结果 一、引言 在排序算法的大家族中,希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序…...

RDMA驱动学习(二)- command queue

为了实现用户对网卡硬件的配置,查询,或者执行比如create_cq等命令,mellanox网卡提供了command queue mailbox的机制,本节将以create_cq为例看下这个过程。 command queue(后续简称cmdq)是一个4K对齐的长度…...

H2 Database IDEA 源码 DEBUG 环境搭建

H2 Database IDEA 源码 DEBUG 环境搭建 基于最新的 version-2.3.230 拉取分支。 git remote add h2 https://github.com/h2database/h2database.git git fetch h2 git checkout -b version-2.3.230 version-2.3.230使用 # 启动 java -jar h2*.jar# H2 shell 方式使用 java …...

nginx系列--(三)--http

本文主要介绍http模块accept read流程,!!!请求对应的响应直接在read流程里就会返回给用户,而不需要通过write事件,和redis一样,基本都不通过eventloop write事件来发送响应给客户端,…...

通过Wireshark抓包分析,体验HTTP请求的一次完整交互过程

目录 一、关于Wireshark 1.1、 什么是Wireshark 1.2、下载及安装 二、HTTP介绍 2.1、HTTP请求过程介绍 2.2 、TCP协议基础知识 2.2.1、概念介绍 2.2.2、TCP协议的工作原理 2.2.3、三次握手建立连接 2.3.4、四次挥手断开连接 2.3、Wireshark抓包分析过程 2.3.1、三次握…...

Requestium:Python中的Web自动化新贵

文章目录 Requestium:Python中的Web自动化新贵背景:为何选择Requestium?Requestium是什么?如何安装Requestium?简单的库函数使用方法场景应用常见Bug及解决方案总结 Requestium:Python中的Web自动化新贵 背…...

2024版红娘金媒10.3婚恋相亲系统源码小程序(亲测)

1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好, 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务,通过红娘的介入,提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管理线下或线…...

k8s-实战——ES集群部署

文章目录 yaml文件es-pvc.yamles-svc.yamles-cluster-sts.yaml创建elasticsearch集群yaml文件 es-pvc.yaml 通过nfs服务进行新增pv并通过labels关联pvc前置准备需要提前准备pv的服务器以及挂在路径--- apiVersion: v1 kind: PersistentVolume metadata:name: nfs-es-pv-data-...

无人机的就业前景怎么样?

无人机的就业前景在当前及未来一段时间内都非常广阔。随着低空经济的蓬勃发展,无人机在农业、公安、测绘、交通、应急救援、影视拍摄等多个领域得到了广泛应用,对无人机操控员和相关专业人才的需求也随之急剧增加。 一、无人机操控员的就业前景 1. 高需…...

【学习】软件测试中V模型、W模型、螺旋模型三者介绍

在软件工程的星辰大海之中,存在着三种独特的航路图:V模型、W模型以及螺旋模型。它们分别以各自的方式描绘了软件开发与测试的不同旅程。 首先映入眼帘的是V模型——一个以垂直线条贯穿始终的简洁图形。这个模型如同一座倒立的“V”字形山峰,…...

Kafka存储机制大揭秘:从日志结构到清理策略的全面解析

文章目录 一、前言二、日志存储结构1.日志文件结构2.topic3.partition4.segment索引文件5.message结构6.message查找过程 三、存储策略1.顺序写2.页缓存3.零拷贝4.缓存机制 四、日志格式演变1.V0 版本2.V1 版本3.V0/V1消息集合4.V2 版本消息格式5.V2版本消息集合 五、偏移量维护…...

显卡服务器和普通服务器之间的区别有哪些?

显卡服务器也被称之为GPU服务器,显卡服务器与普通的服务器之间有着很明显的区别,下面就让我们共同来了解一下吧! 普通服务器的主要处理器通常都是配备的中央处理器,可以用于执行大部分通用计算任务和操作系统的管理;而…...

国产科技里程碑:自主算力走向世界,“表格编程”横空出世

近日,中国高科技领域迎来里程碑式的进展。 据安徽省量子计算工程研究中心官方消息,本源量子计算科技(合肥)股份有限公司(简称“本源量子”)成功向海外销售了其第三代自主超导量子计算机“本源悟空”的机时。…...

人工智能如何改变未来生活:从医疗到日常的全面升级

人工智能如何改变未来生活:从医疗到日常的全面升级 随着人工智能(AI)技术的进步,我们正逐渐看到它为各行各业带来的巨大变革。从医疗、企业到日常生活,AI通过简化流程、提高效率,甚至改善生活质量&#xf…...

第112届全国糖酒会(3月成都)正式官宣!

作为食品饮料行业内备受瞩目的年度盛事,全国糖酒商品交易会(简称“糖酒会”)一直是各大厂商与经销商展现企业风采、寻觅合作伙伴及签署订单的关键舞台。2024年10月31日,第111届全国糖酒商品交易会(秋糖)在深…...

NFT Insider #154:The Sandbox Alpha 4 第四周开启,NBA Topshot NFT 销量激增至新高

市场数据 加密艺术及收藏品新闻 NBA 赛季开幕推动 Topshot NFT 销量激增至新高 随着波士顿凯尔特人队和纽约尼克斯队在 10 月 22 日开启 2024-2025 NBA 赛季的序幕,NBA Topshot 的 NFT 销售量达到了自上赛季季后赛以来的最高水平。截止到 10 月 27 日的这一周&…...