当年他问我service,我是这样回答的

Android 在 service 中实现后台录像 Background video recording in Android 阅读详情

记得前几年刚从某A公司离职到某B公司面试的,面试的人问到了了很多点,就连有些比较基础的都问的比较细节。比如Activity.Service等等。

但是真的细节决定成败往往不注重细节就容易翻车

在这里要告诫大家**会就是会,不会就是不会。不要说精通或者会一点点。**不然你会被问懵逼的

把多年的面试经验整理成为了一份983的PDF(含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记)

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

一.Service 的基本认识

1.1 Service 是什么?

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的组件。它运行于 UI 线程,因此不能进行耗时的操作。

1.2 Service 和 和 Thread 的区别

Service 的运行是在 UI 线程当中的,是绝对绝对不能进行耗时操作的,而 Thread 开启的子线程则可以进行耗时操作,但是 Thread 开启的子线程是不能直接对 UI 进行操作的,否则极有可能发生直接让程序崩掉,这就是它们的区别。

二. 启动 Service 的 的2 种方式

2.1 startService() 方法开启 Service

步骤:

  • a.定义一个类继承 Service。
  • b.在 AndroidManifest.xml 文件中配置该 Service。
  • c.使用 Context 的 startService(Intent)方法启动该 Service。
  • d.不再使用该 Service 时,调用 Context stopService(Intent)方法停止该 Service。
2.2 bindService 方法开启 Service(Activity 与 Service 绑定)

步骤:

  • a.创建 BinderService服务端,继承自 Service 并在类中创建一个实现 IBinder 接口的实现
    实例对象并提供公共方法给客户端调用。
  • b.从 onBind()回调方法返回此 Binder 实例。
  • c.在客户端中,从 onServiceConnected 回调方法接收 Binder,并使用提供的方法调用绑定
    服务。

三.Service的生命周期

服务的生命周期有两种,因为服务可以跟 Activity 绑定起来,也可以不绑定,Activity和服务进行通信的话,是需要把服务和 Activity 进行绑定的。因此服务的生命周期分为未绑定 Activity 的和绑定 Activity 的。

没有绑定 Activity 的服务生命周期图:

绑定 Activity 的服务生命周期图:

1.通过 Intent 和 startService()方法启动了一个服务,接下来执行 onCreate()方法,首次创建服
务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind()之前)。如果服务已在运行,则不会调用此方法。

2.当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)

3.服务开始处于运行状态。

4.某个操作导致服务停止,比如执行了方法 stopService(),那么服务接下来会执行onDestory()销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

5.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

6.通过 Intent 和 bindService()方法启动了一个服务,接下来会执行 onCreate()方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法。

7.当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务
进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null。

8.服务开始处于运行状态。成功与 Activity 绑定。

9.某个操作导致服务解除绑定,比如执行了方法 unbindService(),那么服务接下来会解除与
当前 Activity 的绑定。接下来服务将面临销毁。

10.服务执行 onDestory()方法被销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

11.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

关于服务,总结一下:

a. 被启动的服务的生命周期:
如果一个 Service 被某个 Activity 调用 Context.startService方法启动,那么不管是否有 Activity 使用 bindService 绑定或 unbindService 解除绑定到该
Service,该 Service 都在后台运行。如果一个 Service 被 startService 方法多次启动,那么onCreate 方法只会调用一次,onStart 将会被调用多次(对应调用 startService 的次数),并且系统只会创建 Service 的一个实例(因此你应该知道只需要一次 stopService 调用)。该Service 将会一直在后台运行,而不管对应程序的 Activity 是否在运行,直到被调用stopService,或自身的stopSelf 方法。当然如果系统资源不足,android 系统也可能结束服务。

b. 被绑定的服务的生命周期:
如果一个 Service 被某个 Activity 调用 Context.bindService方法绑定启动,不管调用 bindService 调用几次,onCreate 方法都只会调用一次,同时onStart 方法始终不会被调用。当连接建立之后,Service 将会一直运行,除非调用Context.unbindService 断开连接或者之前调用 bindService 的 Context 不存在了(如
Activity 被 finish 的时候),系统将会自动停止 Service,对应 onDestroy 将被调用。

c. 被启动又被绑定的服务的生命周期:
如果一个 Service 又被启动又被绑定,则该 Service将会一直在后台运行。并且不管如何调用,onCreate 始终只会调用一次,对应 startService调用多少次,Service 的 onStart 便会调用多少次。调用 unbindService 将不会停止 Service,而必须调用 stopService 或 Service 的 stopSelf 来停止服务。

d. 当服务被停止时清除服务:
当一个 Service 被终止
1、调用 stopService;
2、调用stopSelf;
3、不再有绑定的连接(没有被启动))时,onDestroy 方法将会被调用,在这里你应当做一些清除工作,如停止在 Service 中创建并运行的线程。

特别注意:
1、你应当知道在调用 bindService 绑定到 Service 的时候,你就应当保证在某处调用unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自动解除,并且 Service 会自动停止);

2、你应当注意 使用 startService 启动服务之后,一定要使用 stopService 停止服务,不管你是否使用 bindService;

3、同时使用 startService 与 bindService 要注意到,Service 的终止,需要 unbindService与 stopService 同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如 Activity 被 finish 的时候)之后服务才会自动停止;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService
建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。

5、在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart任然有效。这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其
以后的版本,那么你应当使用 onStartCommand 而不是 onStart。

请查看完整的PDF版

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

【K8S系列】Kubernetes 中如何检查Service和Pod的标签是否匹配? 在 Kubernetes 中,检查 Service 和 Pod 的标签是否匹配是确保服务正常工作的关键步骤。以下是详细的检查方法和步骤: 阅读详情

相关推荐

android通过oma获取ESE的CPLC

一个简单的通过oma获取ESE的CPLC的小程序,供大家参考只用

AI论文格式优化工具:智能排版与一键合规

文档格式处理是学术写作中的常见痛点,涉及排版规范、标点符号、参考文献等多个技术细节。传统方法依赖人工逐项调整,效率低下且易出错。通过NLP和深度学习技术,智能排版工具能自动识别中英文混排错误、标点符号误用等格式问题,并基于CSS-in-JS和差分算法实现精准修改。这类工具特别适合处理学位论文、期刊投稿等需要严格遵循格式规范的场景,能显著提升写作效率。以Paperxie AI为例,其智能诊断系统可检测98.7%的中文标点错误,并提供一键合规改造功能,有效解决页眉页脚不统一、目录页码错位等典型问题。

weixin_33701564的博客 498

ADC INL&DNL测试方法和实例

本文介绍了一种可操作的ADC INL和DNL的测试方法--直方图法(也称码密度法)。并实际使用该方法测试了两款芯片的ADC INL和DNL

APTCHIP的博客 1万+

android访问NFC的SE

SE:Secure Element 分享一个网址:https://code.google.com/p/seek-for-android/ android访问NFC的SE所有文档都在这里。 可惜的是,目前只能访问内部SE,对于外部sim或SD的SE,几乎所有的手机都不支持,原因:支持SIM卡的SE,还没有AT命令;支持SD卡的SE,还没有API接口。为什么会这样,很简单,因为它们不是googl

I feel so close to you right now! 8885

经典密码体制(上)

头歌

shannidawang的博客 3086

基于STM32F407与AD9910/AD9959的高频可调DDS信号源设计与实战

本文详细介绍了基于STM32F407微控制器与AD9910/AD9959高性能DDS芯片的高频可调信号源设计与实现。文章从DDS原理入手,阐述了双芯片方案的优势,并重点分享了高频电路设计中的电源、PCB布局布线等关键硬件设计技巧与避坑指南。同时,提供了通过SPI配置DDS芯片及利用Matlab生成任意波形的软件驱动方法,旨在帮助开发者打造一个覆盖10Hz至4200MHz的实用信号发生器。

weixin_36184718的博客 120

android Sevice详解

写了这么久代码了,每次到写服务的时候总会忘记怎么写,那我就把你记到这里,这下忘记了就不会到处翻别人的博客了。 先上图,有图有真相,先上从别人那里盗来的生命周期图 启动服务用三种方式: 1,startService 2,bindService 3,startService和bindService连用 各个模式的区别 1,startService启动的生命周期 onCreate

xiaoke804376088的博客 723

ANSYS CFX 自定义函数数据导入实战指南

本文详细介绍了在ANSYS CFX中实现自定义函数数据导入的完整流程与实战技巧。通过具体案例,指导用户如何将外部实验或计算数据(如材料属性随温度变化)导入CFX,创建可调用的函数,并正确关联到仿真模型中,从而显著提升仿真的真实性与准确性。

v6b7n8m9q0的博客 702

Android 在Sevice使用startService

Android Service --startSevice

CongPong的博客 1374

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 504

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作

weixin_46877907的博客 2110

Android——service使用详解

如果服务同时处理多个 onStartCommand() 请求,则不应在处理完一个启动请求之后立即销毁服务,因为此时可能已经收到了新的启动请求,在第一个请求结束时停止服务会导致第二个请求被终止。通过Log日志可以发现,多次点击“播放音乐”按钮,“onCreate()”方法只会在初始时调用一次,“onStartCommand(Intent intent, int flags, int startId)”方法会在每次点击时都被调用,点击“停止音乐”按钮,“onDestroy()”方法会被调用。

2401_86637658的博客 3827

OpenClaw三层记忆系统:让你的AI助理记住你的习惯,越用越顺手

对于更早的、已经移出滑动窗口的对话内容,我们没有直接丢弃,而是用大模型做摘要压缩,只保留核心信息,然后把摘要存入短期会话记忆的末尾,或者长期用户记忆。比如,10轮之前的对话内容,我们会压缩成:“用户之前查询了仓山万达店4月1日-4月7日的库存数据,对报表的要求是纯文本,不要Markdown”,既保留了核心信息,又不会占用太多上下文窗口。如果说Agent的执行链路是AI的“骨架”,工具调用体系是AI的“手脚”,那么记忆系统就是AI的“大脑”

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 378

当年他问我service,我是这样回答的,flutter框架

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

m0_57077948的博客 1089

上午题目复习ing

无线局域网,11b是常用的,2.4ghz,后来改进5ghz,有些字段可以工作在5g的字段802.11/11a/1h/11n,,,,,11b和11g还在2.4ghz工作。数据链路层 传输服务,数据链路维护,差错控制,arp ip到mac,rarp反过来,token ring,x.25,atm,ethernet,蓝牙10m,简化因特网,分散式网,快调频,短包,点对点,点多多点,2.4ghz,最高速率1mb/s。gsm:是时分多址,900m-1800m,微蜂窝是市区,微微风是室内,伞是盲点,

weixin_47120900的博客 893

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

当年他问我service,我是这样回答的(3)

如果一个 Service 被某个 Activity 调用。

m0_74931244的博客 756

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

当年他问我service,我是这样回答的(1)

对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。!文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!**

2401_83816794的博客 433

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

对service的4个问题的回答

1.Service的start和bind状态有什么区别?2.同一个service,先start然后bindService,如何把它停止调?3.serviceCommand方法的返回值的不同含义是什么?4.service的生命周期方法onCreate,onStart,onBind等运行在哪个线程?1start和启动它的组件没有关系,它有自己独立的生命周期,而bindService这个service依...

ddd5678的博客 527

C++ 第 35 课:Service——“我问你,你回答我”

把这两层分开,就清楚了。

qq_56657939的博客 89

Service 使用场景深度解析

例如:健身追踪应用需要持续收集传感器数据,应该使用前台 Service;:Service 适合主动控制的持续任务(如音乐播放),WorkManager 适合延迟执行的后台作业(如日志上传):避免在 Service 中持有 Activity 的强引用,改用 WeakReference":WorkManager 会受省电模式限制,Service 可前台运行保障优先级。:需要与 UI 组件(如 Activity)强绑定时选择带绑定的 Service。:低于 API 26 且需要即时执行时选择 Service。

斗锋在干嘛的博客 947

业务逻辑需要放在service层_CTO问:Service层真的需要接口吗?

前几天刷到个问题:Service 层和 Dao 层真的有必要每个类都加上接口吗?这个问题之前简单回答了一波,给出的观点是看情况!今天我们要探讨的问题是:Service 层需要接口吗?图片来自 Pexels现在结合我参与的项目以及阅读的一些项目源码来看。如果项目中使用了像 Spring 这样的依赖注入框架,那可以不用接口!先来说说为什么使用了依赖注入框架以后,可以不使用接口!不需要接口的理由我整理了...

weixin_35725559的博客 1652

面试问你Android中Context,你如何回答?

Context的中文翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”在语文中,我们可以理解为语境,在程序中,我们可以理解为当前对象在程序中所处的一个环境,一个与系...

qxf865618770的博客 471

【Azure Bot Service】在机器人服务中如何调用LLM来回答问题呢?

摘要:本文介绍了如何在Azure Bot Service中集成大语言模型(如Azure OpenAI)来增强聊天机器人功能。通过Python代码示例,展示了如何调用Azure OpenAI API获取回答:1) 配置API密钥和端点;2) 创建请求函数处理prompt和响应;3) 在EchoBot的on_message_activity方法中调用API接口。实现方法简单直接,只需在原有Bot框架中添加约20行代码即可让机器人获得大模型能力,适用于需要智能对话的场景。

编码者卢布,国家认证程序员,十八年开发人员,目前生活在云环境。 1347

self service password 邮件修改_LDAP密码修改系统 Self Service Password

安装升级PHPhttps://www.centos.bz/2018/05/centos-6-7-%E5%8D%87%E7%BA%A7-php-5-6-%E5%88%B0-7-1-7-2/安装Self Service Password下载地址:https://ltb-project.org/download#self_service_password参考地址:https://ltb-pro...

weixin_40006965的博客 867

不同controller可以调用同一个service吗_CTO问:Service层真的需要接口吗?

前几天刷到个问题:Service 层和 Dao 层真的有必要每个类都加上接口吗?这个问题之前简单回答了一波,给出的观点是看情况!今天我们要探讨的问题是:Service 层需要接口吗?图片来自 Pexels现在结合我参与的项目以及阅读的一些项目源码来看。如果项目中使用了像 Spring 这样的依赖注入框架,那可以不用接口!先来说说为什么使用了依赖注入框架以后,可以不使用接口!不需要接口的理由我整理了...

weixin_39969232的博客 286
上一篇: 你告诉我太卡了,那是你不晓得性能优化之app卡顿优化
下一篇: 答应我,我踩过的坑你别再踩了好嘛,那些年社招的坑坑洼洼
初壹十五a
博客等级 码龄8年 146粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值