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

【Android】Service介绍和生命周期

人不走空

                                                                      

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

图片

 

介绍

Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。

Android中的服务Service,和Activity不同的是不能与用户交互的,不能自己启动,系统的后台运行,当程序退出时,我们没有显示的调用停止服务,那么这个Service就没有结束,它仍然在后台运行。Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的操作。

服务一般分为两种:

  • 本地服务:用于应用程序内部,在Service可以调用startService()启动,调用stopService()结束,无论调用了多少次startService(),都只需调用一次stopService()来停止,采用startService()方法启动服务,只能调用stopService()方法结束服务,服务结束时会调用onDestroy()方法,。

  • 远程服务,用于系统内部的应用程序之间,可以定义接口并把接口暴露出来,以便其他应用进行操作,客户端建立到服务对象的连接,并通过那个连接来调用服务,调用bindService()方法建立连接,并启动,以调用unbindService()关闭连接,多个客户端可以绑定至同一个服务。

Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作。

service在清单文件中的声明

不管是哪一种的 service ,也都需要在 AndroidManifest.xml中声明

<service android:name=".myservice"android:enabled="true"android:exported="true"android:icon="@drawable/background_blue"android:label="string"android:process="string"android:permission="string"></service>

说明:

字段说明
android:exported表示是否允许除了当前程序之外的其他程序访问这个服务
android:enabled表示是否启用这个服务
android:permission是权限声明
android:process是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。
android:isolatedProcess设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。

生命周期

Service 的的生命周期会根据调用不同的方法启动有不同的表现,具体有两种形式。 

  • 通过 startService(Intent intent) 启动 Service 生命周期是这样的:onCreate() 、onStartCommand()、onStart()(已经过时) 、onDestroy() 

  • 通过 bindService(Intent intent,ServiceConnection conn,int flags) 启动 Service 生命周期是这样的:bindService()、onCreate() 、IBinder onBind(Intent intent)、unBindService()、onDestroy() 方法。 

图片

说明:

1.startService / stopService 

生命周期顺序:onCreate->onStartCommand->onDestroy

OnCreate() 

系统在service第一次创建时执行此方法,来执行只运行一次的初始化工作。如果service已经运行,这个方法不会被调用。 

onStartCommand() 

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

OnDestory() 

系统在service不再被使用并要销毁时调用此方法(一次调用)。service应在此方法中释放资源,比如线程,已注册的侦听器,接收器等等.这是service收到的最后一个调用。 

2.bindService / unbindService 

生命周期顺序:onCreate->onBind->onUnBind->onDestroy 同样首先是OnCreate(),接着是 

OnBind() 当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法(一次调用,一旦绑定后,下次再调用bindService()不会回调该方法)。在你的实现中,你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null。 

OnUnbind() 当前组件调用unbindService(),想要解除与service的绑定时系统调用此方法(一次调用,一旦解除绑定后,下次再调用unbindService()会抛出异常)。 

最后是OnDestory() 

注意:通过bindService启动的Service的生命周期依附于启动它的Context。

start开启服务的生命周期:

  • 完整生命周期:onCreate()-->onStartCommand()-->onDestroy() 

  • 开启服务:onCreate()-->onStartCommand() 

  • 停止服务:onDestroy()

start开启服务的生命周期特点: 

1. 服务可以被开启多次,每次开启都调用onStartCommand 

2. 服务只能被停止一 

3. 长期运行在后台

bind绑定服务的生命周期

  • bindService(service, conn, flags); 

    service :意图 

    conn :activity和服务的连接通道 

    flags : BIND_AUTO_CREATE 连接的时候如果有服务的对象则复用,如果服务对象不存在,则创建一个服务的对象 

  • 完整生命周期:onCreate()-->onBind()-->onUnbind()-->onDestroy() 

  • 绑定服务:onCreate()-->onBind() 

  • 解绑服务:onUnbind()-->onDestroy()

bind绑定服务的生命周期特点: 

1. 服务只能被绑定一次,多次绑定无效 

2. 服务只能被解绑一次,多次解绑会抛出异常 

3. activity和绑定的Service是同生共死 

4. 绑定服务调用服务里的方法 

区别 

  • start开启服务可以长期运行在后台,服务组件在自己的应用程序中 

  • bind绑定服务可以调用服务里的方法,服务组件不在自己的应用程序中

IntentService与Service

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。 

那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService,IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。 

Service的官方介绍 

1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。 

2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作 IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。 

IntentService有以下特点: 

1.它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。 

2.创建了一个工作队列,来逐个发送intent给onHandleIntent()。 

3.不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。 

4.默认实现的onBind()返回null 

5. 默认实现的onStartCommand()的目的是将intent插入到工作队列中 

继承IntentService的类至少要实现两个函数:构造函数和onHandleIntent()函数。要覆盖IntentService的其它函数时,注意要通过super调用父类的对应的函数

示例:

package com.loaderman.intentservicedemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding//连续两次启动IntentService,会发现应用程序不会阻塞,而且最重要的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)startService(new Intent(this,MyIntentService.class));startService(new Intent(this,MyIntentService.class));}
}

package com.loaderman.intentservicedemo;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;public class MyService extends Service {@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作System.out.println("onStart");try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("睡眠结束");}@Overridepublic IBinder onBind(Intent intent) {return null;}
}

package com.loaderman.intentservicedemo;import android.app.IntentService;
import android.content.Intent;public class MyIntentService extends IntentService {public MyIntentService() {super("loaderman");}@Overrideprotected void onHandleIntent(Intent intent) {// 经测试,IntentService里面是可以进行耗时的操作的//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个System.out.println("onStart");try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("睡眠结束");}
}

能否保证service不被杀死?

Service设置成START_STICKY kill 

后会被重启(等待5秒左右),重传Intent,保持与重启前一样 

提升service优先级

在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。 

【结论】目前看来,priority这个属性貌似只适用于broadcast,对于Service来说可能无效 

提升service进程优先级 

Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收 

当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以在startForeground()使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。 

【结论】如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart() 

onDestroy方法里重启service 

service +broadcast 方式,就是当service走onDestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service 

也可以直接在onDestroy()里startService 

【结论】当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证 

监听系统广播判断Service状态 

通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限 

【结论】这也能算是一种措施,不过感觉监听多了会导致Service很混乱,带来诸多不便 

在JNI层,用C代码fork一个进程出来 

这样产生的进程,会被系统认为是两个不同的进程.但是Android5.0之后可能不行 

root之后放到system/app变成系统级应用 

大招: 放一个像素在前台(手机QQ)


作者其他作品:

【Java】Spring循环依赖:原因与解决方法

OpenAI Sora来了,视频生成领域的GPT-4时代来了

[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读

【Java】深入理解Java中的static关键字

[Java·算法·简单] LeetCode 28. 找出字a符串中第一个匹配项的下标 详细解读

了解 Java 中的 AtomicInteger 类

算法题 — 整数转二进制,查找其中1的数量

深入理解MySQL事务特性:保证数据完整性与一致性

Java企业应用软件系统架构演变史 

相关文章:

【Android】Service介绍和生命周期

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 介绍 Service是Android程序中四大基础组件之一&#xff0c;它和Activity一样都是Context的子类&#xff0c;只不…...

[论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天带来又一篇RAG论文笔记&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 检索增强语言模型能够更好地适应世界状态的变化并融入长尾知识。然而&#xff0c;大多数现有方法只能从检索语料库中检索到短的连续文本片段&#xff0…...

python 端口的转发

实现端口的转发 tcpsocket.py 对基础的socket进行了封装 import socketclass baseSocket:def service(host:str,port:int,maxSuspend:int)->socket: service_socket socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建 socket 对象service_socket.setso…...

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…...

Flask+Layui开发案例教程

基于 Python 语言的敏捷开发框架_DjangoAdmin敏捷开发框架FlaskLayui版本_开发文档 软件产品基于 Python 语言&#xff0c;采用 Flask2.x、Layui、MySQL 等技术栈精心打造的一款集模块化、高性能、组件化于一体的企业级敏捷开发框架&#xff0c;本着简化开发、提升开发效率的初…...

复现ORB3-YOLO8项目记录

文章目录 1.编译错误1.1 错误11.2 错误21.3 错误31.4 错误4 1.编译错误 首先ORB-SLAM相关项目已经写过很多篇博客了&#xff0c;从ORB-SLAM2怎么运行&#xff0c;再到现在的项目。关于环境已经不想多说了 1.1 错误1 – DEPENDENCY_LIBS : /home/lvslam/ORB3-YOLO8/Thirdparty…...

【jvm】字符串常量池问题

目录 一、基本概念1.1 说明1.2 特点 二、存放位置2.1 JDK1.6及以前2.2 JDK1.72.3 JDK1.8及以后 三、工作原理3.1 创建字符串常量3.2 使用new关键字创建字符串 四、intern()方法4.1 作用 五、优点六、字节码分析6.1 示例16.1.1 代码示例6.1.2 字节码6.1.3 解析 6.2 示例26.2.1 代…...

STM32学习和实践笔记(39):I2C EEPROM实验

1.I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I…...

【Js】导出 HTML 为 Word 文档

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。 html样式 word文档 工具准备 1、 html-docx-js - npm html-docx-js是一个 JavaScript 库&#xff0c;用于将 HTML 内容转换为 Word 文档的格式。它…...

c++入门基础篇(上)

目录 前言&#xff1a; 1.c&#xff0b;&#xff0b;的第一个程序 2.命名空间 2.1 namespace的定义 2.2 命名空间使用 3.c&#xff0b;&#xff0b;输入&输出 4.缺省参数 5.函数重载 前言&#xff1a; 我们在之前学完了c语言的大部分语法知识&#xff0c;是不是意…...

Java实现数据结构——双链表

目录 一、前言 二、实现 2.1 类的创建 三、对链表操作实现 3.1 打印链表 3.2 插入数据 3.2.1 申请新节点 3.2.2 头插 ​编辑 3.2.3 尾插 3.2.4 链表长度 3.2.5 任意位置插入 3.3 删除数据 3.3.1 头删 3.3.2 尾删 3.3.3 删除指定位置数据 3.3.4 删除指定数据 3…...

Python应用爬虫下载QQ音乐歌曲!

目录&#xff1a; 1.简介怎样实现下载QQ音乐的过程&#xff1b; 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网&#xff1a; https://y.qq.com/&#xff0c;在搜索栏上输入一首歌曲的名称&#xff1b; 如我在上输入最美的期待&#xff0c;按回车来到这个画面 我们首…...

AWS-WAF-Log S3存放,通过Athena查看

1.创建好waf-cdn 并且设置好规则和log存储方式为s3 2. Amazon Athena 服务 使用 &#xff08;注意s3桶位置相同得区域&#xff09; https://docs.aws.amazon.com/zh_cn/athena/latest/ug/waf-logs.html#waf-example-count-matched-ip-addresses 官方文档参考,建一个分区查询表…...

无法解析主机:mirrorlist.centos.org Centos 7

从 2024 年 7 月 1 日起&#xff0c;在 CentOS 7 上&#xff0c;请切换到 Vault 存档存储库&#xff1a; vi /etc/yum.repos.d/CentOS-Base.repo 复制/粘贴以下内容并注意您的操作系统版本。如果需要&#xff0c;请更改。此配置中的版本为 7.9.2009&#xff1a; [base] name…...

自动驾驶论文总结

1.预测 1.1光栅化 代表性论文 Motion Prediction of Traffic Actors for Autonomous Driving using Deep Convolutional Networks (Uber)MultiPath (Waymo) 问题 渲染信息丢失感受野有限高计算复杂度 1.2图神经网络 1.2.1 图卷积 LaneGCN (uber 2020) 1.2.2 边卷积 V…...

【uniapp微信小程序】uniapp微信小程序——页面通信

uniapp微信小程序——页面通信 在开发微信小程序过程中&#xff0c;页面之间的通信是一个常见需求。在使用 uniapp 开发微信小程序时&#xff0c;我们可以采用多种方式实现页面之间的数据传递和状态共享。本文将详细介绍几种常见的实现方式&#xff0c;以供开发者参考。 1. 页…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(上)

此文只是我的笔记&#xff0c;不包全看懂&#xff0c;有问题可评论 PS贴图加工 1.打开ps 拖入uv图&#xff0c;新建图层&#xff0c;设置背景色为灰色&#xff0c;改一下图层名字 2.按z缩小一下uv图层&#xff0c;拖入实体uv图片&#xff08;目的是更好上色&#xff0c;比如…...

线性代数|机器学习-P22逐步最小化一个函数

文章目录 1. 概述2. 泰勒公式3. 雅可比矩阵4. 经典牛顿法4.1 经典牛顿法理论4.2 牛顿迭代法解求方程根4.3 牛顿迭代法解求方程根 Python 5. 梯度下降和经典牛顿法5.1 线搜索方法5.2 经典牛顿法 6. 凸优化问题6.1 约束问题6.1 凸集组合 Mit麻省理工教授视频如下&#xff1a;逐步…...

SpringCloudAlibaba Nacos配置中心与服务发现

目录 1.配置 1.1配置的特点 只读 伴随应用的整个生命周期 多种加载方式 配置需要治理 1.2配置中心 2.Nacos简介 2.1特性 服务发现与服务健康检查 动态配置管理 动态DNS服务 服务和元数据管理 3.服务发现 1.配置 应用程序在启动和运行的时候往往需要读取一些配置信…...

.NET 一款获取内网共享机器的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点(持续)

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…...

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…...

Python酷库之旅-第三方库Pandas(021)

目录 一、用法精讲 52、pandas.from_dummies函数 52-1、语法 52-2、参数 52-3、功能 52-4、返回值 52-5、说明 52-6、用法 52-6-1、数据准备 52-6-2、代码示例 52-6-3、结果输出 53、pandas.factorize函数 53-1、语法 53-2、参数 53-3、功能 53-4、返回值 53-…...

jvm 06 补充 OOM 和具体工具使用

1.OOM 是什么 OOM&#xff0c;全称“Out Of Memory”&#xff0c;翻译成中文就是“内存用完了”&#xff0c;来源于java.lang.OutOfMemoryError。看下关于的官方说明&#xff1a; Thrown when the Java Virtual Machine cannot allocate an object because it is out of memor…...

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析 (scikit-learn Open3D numpy)

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域&#xff0c;最近邻算法&#xff08;Nearest Neighbors&#xff09;是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…...

安装jenkins最新版本初始化配置及使用JDK1.8构建项目详细讲解

导读 1.安装1.1.相关网址1.2.准备环境1.3.下载安装 2. 配置jenkins2.1.安装插件2.2.配置全局工具2.3.系统配置 3. 使用3.1.配置job3.2.构建 提示&#xff1a;如果只想看如何使用jdk1.8构建项目&#xff0c;直接看3.1即可。 1.安装 1.1.相关网址 Jenkins官网&#xff1a;https…...

微软子公司Xandr遭隐私诉讼,或面临巨额罚款

近日&#xff0c;欧洲隐私权倡导组织noyb对微软子公司Xandr提起了诉讼&#xff0c;指控其透明度不足&#xff0c;侵犯了欧盟公民的数据访问权。据指控&#xff0c;Xandr的行为涉嫌违反《通用数据保护条例》&#xff08;GFPR&#xff09;&#xff0c;因其处理信息并创建用于微目…...

【VRP】基于常春藤算法IVY求解带时间窗的车辆路径问题TWVRP,最短距离附Matlab代码

% VRP - 基于IVY算法的TWVRP最短距离求解 % 数据准备 % 假设有一组客户点的坐标和对应的时间窗信息 % 假设数据已经存储在 coordinates、timeWindows 和 demands 变量中 % 参数设置 numCustomers size(coordinates, 1); % 客户点数量 vehicleCapacity 100; % 车辆容量 numV…...

常用软件的docker compose安装

简介 Docker Compose 是 Docker 的一个工具&#xff0c;用于定义和管理多容器 Docker 应用。通过使用一个单独的 YAML 文件&#xff0c;您可以定义应用所需的所有服务&#xff0c;然后使用一个简单的命令来启动和运行这些服务。Docker Compose 非常适合于微服务架构或任何需要…...

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…...