【四大组件】-- 服务 Service

服务

Service-服务(一)生命周期及使用方式
Service-服务(二)onStartCommand()详解
Service.onStartCommand()详解

什么是服务

它和Activity一样都是Context的子类,只不过它没有UI界面, 是在后台运行的组件。
默认运行在主线程中,因此不要在Service中执行耗时的操作, 除非你在Service中创建了子线程来完成耗时操作。

服务分类

  1. 按照运行地点分类:
    本地服务:运行在相同进程上,不需要IPC就可以与此服务通信。
    远程服务:运行在独立的进程上,使用服务的进程被kill不会对服务进程造成影响,但是使用服务需要IPC机制。

  2. 按照运行类型分类:
    前台服务:会在通知栏显示onGoing的Notification,如音乐播放服务,当服务被终止时,通知栏的Notification也会消失。
    后台服务:默认的服务即后台服务,不会在通知栏显示。
    所谓前台服务只不过是通过一定的方式将服务所在的进程级别提升了。
    前台服务会一直有一个正在运行的图标在系统的状态栏显示, 非常类似于通知的效果。
    由于后台服务优先级相对比较低, 当系统出现内存不足的情况下, 它就有可能会被回收掉, 所以前台服务就是来弥补这个缺点的, 它可以一直保持运行状态而不被系统回收。

  3. 按照使用方式分类:
    startService启动的服务
    bindService启动的服务
    两者同时使用启动的服务

服务的生命周期

  1. 通过startService启动服务
    onCreate()
    onStartCommand(): 每次客户端调用startService()方法启动该Service都会回调该方法( 多次调用) 。 一旦这个方法执行, service就启动并且在后台长期运行。 通过调用stopSelf()或stopService()来停止服务。
    running
    onDestroy()

  2. 通过bindService绑定服务
    onCreate()
    onBind():当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法( 一次调用, 一旦绑定后, 下次再调用bindService()不会回调该方法) 。 在你的实现中, 你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯, 你必须总是实现这个方法, 但是如果你不允许绑定, 那么你应返回null。
    running
    onUnbind(): 当前组件调用unbindService(), 想要解除与service的绑定时系统调用此方法( 一次调用, 一旦解除绑定后, 下次再调用unbindService()会抛出异常) 。
    onDestroy()
    注意: 通过bindService启动的Service的生命周期依附于启动它的Context。 因此当前台调用bindService的Context销毁后, 那么服务会自动停止。

  3. 混合型(bindService和startService同时使用时):
    当一个Service在被启动(startService)的同时又被绑定(bindService), 该Service将会一直在后台运行, 并且不管调用几次, onCreate方法始终只会调用一次,onStartCommand的调用次数与startService调用的次数一致( 使用bindService方法不会调用onStartCommand) 。 同时, 调用unBindService将不会停止Service, 必须调用stopService或Service自身的stopSelf来停止服务。

在什么情况下使用 startService 或 bindService 或 同时使用startService 和 bindService?

  1. 如果你只是想要启动一个后台服务长期进行某项任务那么使用 startService 便可以了。
  2. 如果你想要与正在运行的 Service 取得联系, 那么有两种方法, 一种是使用broadcast , 另外是使用 bindService。
    前者的缺点是如果交流较为频繁, 容易造成性能上的问题, 并且 BroadcastReceiver 本身执行代码的时间是很短的( 也许执行到一半, 后面的代码便不会执行)。
    而后者则没有这些问题, 因此我们肯定选择使用 bindService( 这个时候你便同时在使用 startService 和 bindService 了, 这在Activity 中更新 Service 的某些运行状态是相当有用的) 。
  3. 如果你的服务只是公开一个远程接口, 供连接上的客服端( android 的 Service是C/S架构) 远程调用执行方法。 这个时候你可以不让服务一开始就运行, 而只用bindService , 这样在第一次 bindService 的时候才会创建服务的实例运行它, 这会节约很多系统资源, 特别是如果你的服务是Remote Service, 那么该效果会越明显( 当然在 Service 创建的时候会花去一定时间, 你应当注意到这点)。

服务的执行线程

Service默认并不会运行在子线程中,Service是在主线程里执行操作的,因此,不要在Service中执行耗时的操作,避免因为执行耗时操作而导致ANR,除非你在Service中创建了子线程来完成耗时操作。

常见面试问题

Service相关面试题
service 两种启动方式的生命周期?
Service的两种启动方式?区别在哪?
如何保证Service不被杀死 ?
android六种方法保证service不被杀死
Service与Activity怎么实现通信?
Service相关面试题
IntentService是什么,IntentService原理,应用场景及其与Service的区别?
Android多线程2:IntentService
Service 的 onStartCommand 方法有几种返回值?各代表什么意思?
bindService和startService混合使用的生命周期以及怎么关闭?
Service相关面试题
用过哪些系统Service ?
了解ActivityManagerService吗?发挥什么作用?
ActivityManagerService

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索不同类型的“低”之魅力

随着数字化转型的浪潮不断高涨,低代码平台(LCDP)已逐渐成为企业快速构建和迭代应用程序的重要工具。低代码平台以其高效、灵活和易于集成的特点,受到越来越多企业的青睐。然而,低代码平台并非一蹴而就的单一产品&#…

CST电磁仿真软件表面等离子极化激元SPP --- 一维光栅耦合 - 衍射模式, 效率, Floquet端口

这两期我们看一下衍射光栅的高阶衍射、衍射效率、反射率。具体到仿真设置,就是Floquet端口的模式分析,S参数与衍射效率和反射率的关系。那么研究这些衍射和表面等离子极化激元SPP有什么关系呢?关系可大了,光栅是一种能够用来激励出…

企业微信群发功能:提升沟通效率,助力企业营销

随着信息技术的快速发展,企业微信作为企业内部沟通和企业对外营销的重要工具,其功能也在不断更新和完善。其中,企业微信的多次群发功能,不仅极大地提升了企业内部的沟通效率,更为企业的对外营销提供了强有力的支持。本…

告别鼠标,安卓模拟鼠标,绘图板,手写板操作电脑PC端,卡卡罗特也说好,儿童节快乐

家人们,上链接了:https://download.csdn.net/download/jasonhongcn/89387887 横屏模式: 竖屏模式: 操作说明: 1. 手势滑动模拟鼠标移动 2. 界面如果有滚动条,右手指按紧,通过左手指移动实现…

react高阶组件——withRouter

withRouter是高阶组件&#xff0c;可以通过 withRouter 获取到 history、location、match 对象。 import { withRouter } from umi;export default withRouter(({ history, location, match }) > {return (<div><ul><li>history: {history.action}</l…

力扣:101. 对称二叉树

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; …

mysql DDL——增删改

简略版&#xff1a; 文字化&#xff1a; 1.对全部字段添加数据&#xff1a;insert into 表名 values (值1&#xff0c;值2&#xff0c;值3...); 2.对指定字段添加数据&#xff1a;insert into 表名 (字段名1&#xff0c;字段名2...) values &#xff08;值1&#xff0c;值2..…

跨区域文件管控过程中 如何保障安全和效率?

跨区域文件管控是指在跨越不同地域或区域的情况下对文件进行管理和控制的过程。这种控制可能涉及多个方面&#xff0c;包括安全性、合规性和管理效率等。 为了有效进行跨区域文件管控&#xff0c;组织通常需要采取一系列策略和措施&#xff0c;例如&#xff1a; 1、加密和安全…

java SQLException异常的解决步骤

要解决Java中的SQLException&#xff0c;可以考虑以下几个步骤&#xff1a; 异常处理&#xff1a;在程序中捕获SQLException并进行处理。可以使用try-catch语句块来捕获异常&#xff0c;然后在catch块中处理异常情况。 例如&#xff1a; try {// 执行数据库操作 } catch (SQ…

旺店通·企业奇门和金蝶云星空接口打通对接实战多系统间数据

旺店通企业奇门和金蝶云星空接口打通对接实战 来源系统:旺店通企业奇门 慧策&#xff08;原旺店通&#xff09;是一家技术驱动型智能零售服务商&#xff0c;基于云计算PaaS、SaaS模式&#xff0c;以一体化智能零售解决方案&#xff0c;帮助零售企业数字化智能化升级&#xff0c…

二进制文件(.bin等文件)转C语言数组形式hex文件(.c等文件)

使用python脚本把二进制文件&#xff08;.bin等文件&#xff09;转C语言数组形式hex文件&#xff08;.c等文件&#xff09;&#xff0c;具体代码如下&#xff1a; &#xff08;1&#xff09;读取.bin文件数据 &#xff08;2&#xff09;生成C语言数组定义 &#xff08;3&…

深圳雷龙LSYT201B语音控制模组

文章目录 前言一、芯片简介处理器外设音频蓝牙电源封装温度 二、功能简介管脚描述 三、应用场景四、使用说明五、硬件连接六、FAQ总结 前言 今天拿到的语音控制板是LSYT201B模组&#xff0c;它是深圳市雷龙发展有限公司基于YT2228芯片开发的一款面向智能家居控制的离线语音控制…

第15届蓝桥杯国赛JavaA组个人题解

最后两个概率题不会做, 50分没了 博弈论交了暴力, 30%的分 赛后hack了自己1个填空和一个15分的题 算下来应该是66分, 喜提国一最后一名, rank11 A 田字与直线 题目: 9个点按3*3排成矩阵状, 求恰好经过其中2个点的直线个数 答案 过角的: 4个角, 每个2条 不过角: 4个中点, 4…

员工转正申请精选12个模板供参考

随着社会在不断地进步&#xff0c;我们会经常使用各种各样的申请书&#xff0c;转正申请书就是申请书的一种&#xff0c;那么转正申请书是怎么写的呢&#xff1f;下面是我收集整理的员工转正申请书几个版本&#xff0c;仅供参考&#xff0c;希望能够帮助到大家。别忘了一键三连…

贵的SSL证书跟便宜的SSL证书有什么不一样的?

目前SSL证书市场上从几十块钱的到上万元的都是有的&#xff0c;那么这些着证书之间有什么不同&#xff1f;怎么收费差这么多&#xff1f; 一&#xff1a;从证书的认证安全等级来说 比较便宜的SSL证书一般都是DV验证级别的。也就是说只验证域名的所有权&#xff0c;做一个DNS解…

楼市去金融化, 教育去资本化 ,医疗去市场化

楼市去金融化&#xff0c; 教育去资本化 &#xff0c;医疗去市场化

03.0docker安装

docker简介 docker的主要目标是"Build,Ship and Run any App,Angwhere",构建&#xff0c;运输&#xff0c;处处运行 部署服务&#xff0c;环境问题 一次构建&#xff0c;处处运行 docker是一种软件的打包技术 构建&#xff1a;做一个docker镜像 运输&#xff1a;do…

数据分析常用模型合集(一)AARRR模型和漏斗模型

准备把常用的数据分析模型&#xff0c;像什么AARRR&#xff0c;RFM之类的&#xff0c;逐个全部写一下&#xff1b; 最好能带点案例和代码&#xff0c;搞一个小合集。 最终达到完全不懂的人&#xff0c;看完就能知道得差不多&#xff1b; 数据分析常用模型合集&#xff08;二…

[大师C语言(第十八篇)]C语言typedef背后技术详解

引言 在C语言中&#xff0c;typedef是一个非常有用的关键字&#xff0c;它允许程序员为现有的数据类型定义一个新的名称。这种做法可以提高代码的可读性和可维护性&#xff0c;特别是在处理复杂的数据结构时。本文将深入探讨C语言typedef背后的技术原理&#xff0c;并通过丰富…

大型语言模型简介

大型语言模型简介 大型语言模型 (LLM) 是一种深度学习算法&#xff0c;可以使用非常大的数据集识别、总结、翻译、预测和生成内容。 文章目录 大型语言模型简介什么是大型语言模型&#xff1f;为什么大型语言模型很重要&#xff1f;什么是大型语言模型示例&#xff1f;大型语…