后台进程注册的ContentObserver接收到的回调晚10秒钟

后台进程中的ContentObserver延迟回调晚10秒钟

在Android系统中,后台进程注册的ContentObserver会有一个延迟回调机制,通常延迟10秒左右。这种机制的设计是为了优化系统资源,减少后台进程频繁监听数据变化带来的资源消耗。

在这里插入图片描述

背景

当应用处于后台时,系统会对其资源进行限制,以优化电池续航和系统性能。特别是对非前台的进程,系统会对ContentObserver的回调进行延迟处理。这种延迟机制主要体现在ContentObserver回调的onChange()方法中,影响注册在后台的ContentObserver收到的回调通知。

实现原因与机制

在Android的ActivityManagerService源码中,系统将前台和后台进程分别管理。对于后台进程,系统会降低其优先级,限制频繁的资源访问,尤其是数据变化监听。Android系统会检查当前进程的状态(前台或后台),对后台进程设置延迟调用,机制如下:

  1. 系统判定进程状态:当应用注册ContentObserver时,系统会根据该应用的进程状态决定回调的处理方式。如果是后台进程,系统会标记延迟回调。
  2. 延迟策略:对于后台进程,ContentObserver的回调会被延迟10秒左右。延迟时长并不是固定的10秒,而是根据系统负载动态调整。延迟时间的存在让后台进程无法频繁获取数据变化,节省系统资源。
  3. 触发机制:系统会在每隔一段时间后检查ContentObserver的注册状态,如果观察的URI在10秒内没有发生进一步的变化,则触发延迟回调。

相关源码分析

ContentObserver的延迟机制在ContentService源码中有所体现。以下是相关的源码片段示例:

// frameworks/base/core/java/android/content/ContentService.java/*** Delay to apply to content change notifications dispatched to apps running* in the background. This is used to help prevent stampeding when the user* is performing CPU/RAM intensive foreground tasks, such as when capturing* burst photos.*/private static final long BACKGROUND_OBSERVER_DELAY = 10 * DateUtils.SECOND_IN_MILLIS;public void dispatch() {for (int i = 0; i < collected.size(); i++) {final Key key = collected.keyAt(i);final List<Uri> value = collected.valueAt(i);final Runnable task = () -> {try {key.observer.onChangeEtc(key.selfChange,value.toArray(new Uri[value.size()]), key.flags, key.userId);} catch (RemoteException ignored) {}};// Immediately dispatch notifications to foreground apps that// are important to the user; all other background observers are// delayed to avoid stampedingfinal boolean noDelay = (key.flags & ContentResolver.NOTIFY_NO_DELAY) != 0;final int procState = LocalServices.getService(ActivityManagerInternal.class).getUidProcessState(key.uid);if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND || noDelay) {task.run();} else {BackgroundThread.getHandler().postDelayed(task, BACKGROUND_OBSERVER_DELAY);}}}
}

可以看出,有两个或条件会导致通知回调延迟10秒钟:

  • 后台进程:procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 也就是监听的进程为后台进程;
  • key.flags不为noDelay:发起通知的时候,会传进来一个int flags参数,如果该参数 (key.flags & ContentResolver.NOTIFY_NO_DELAY) != 0,则不会延迟调用。

实际开发过程中遇到的相关问题

在应用实际运行中,这一延迟会导致后台应用对数据变化的反应较慢。这种机制在以下场景中较为显著,比如后台进程监控的实时数据更新只能每隔10秒左右收到一次回调。典型的例子,就是添加到桌面的小部件相关的AppWidgetProvider,一般都运行在跟后台进程中,但是小部件基本都显示在桌面上。其监听的数据变化晚10秒的话,会导致用户感知到的数据刷新晚10秒。这样很大程度上被认为属于软件故障。

应对方案

为了降低这种延迟带来的影响,可以尝试以下策略:

  1. 前台服务:通过启动前台服务(Foreground Service),使应用在后台时也保持前台进程的优先级,从而即时接收数据变化的回调。但是随着Android系统版本的眼睛,后台进程通过启动前台服务使其变为前台进程的方法受到系统越来越多的限制甚至会引发报错。
  2. JobScheduler和WorkManager:在后台场景下,采用JobScheduler或WorkManager来实现数据变化的处理,而非实时监听。
  3. BroadcastReceiver:结合系统广播监听数据变化,适用于一些系统设置变化的场景。
  4. 修改ROM代码:对于可以修改ROM代码的开发人员,也可以在通知变化的地方修改flags为NO_DELAY或者在以上源码中增加白名单,使得特定包名的应用看了一绕过系统原生的延迟机制。

总结

Android后台进程中ContentObserver延迟回调机制是为了系统资源优化而设计。它确保后台应用不会频繁监听数据变化,从而降低系统负载。理解该机制有助于开发者优化应用在后台的数据同步策略,提升应用的系统兼容性和资源管理效率。

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

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

相关文章

RabbitMQ集群搭建及使用

1. 概述 前提条件&#xff1a;linux服务器下已经安装好了docker服务。 本文档将搭建一个三台RabbitMQ的集群&#xff0c;包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。 2. 集群搭建 在一台服务器上创建三个RabbitMQ容器。 2.1.1. 创建容器 执行以下命令创建三…

Python实现PSO粒子群优化DBSCAN膨胀聚类模型(DBSCAN算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着大数据时代的到来&#xff0c;从海量数据中提取有用信息变得至关重要。聚类分析作为一种无监督…

Telephony中ITelephony的AIDL调用关系

以Android14.0源码讲解 ITelephony来自framework下的com.android.internal.telephony包下 frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl这个接口用于与Phone交互的界面&#xff0c;主要由TelephonyManager类使用&#xff0c;一些地方仍在…

【电机控制】相电流重构——单电阻采样方案

【电机控制】相电流重构——单电阻采样方案 文章目录 [TOC](文章目录) 前言一、基于单电阻采样电流重构技术原理分析1.1 单电阻采样原理图1.2 基本电压矢量与电流采样关系 二、非观测区2.1 扇区过渡区2.2 低压调制区 三、非观测区补偿——移相法四、参考文献总结 前言 使用工具…

C++11实践指北

C11&#xff1a;书、在线工具、库。 书 1. 《现代C语言核心特性解析》 覆盖 C11~C20 特性的讲解。 视频跟读&#xff1a;https://www.bilibili.com/video/BV1nN4y1j7fv 现代CPP随笔_0CCh - 每天5分钟了解现代C新特性 2. 《C Primer》第五版 基于 C11 的 C 入门书。 正在看…

java基础面试题一

目录 1、Java语言概述 1.1一个”.java”源文件中是否可以包括多个类&#xff1f;有什么限制 1.2Java 的优势 1.3常用的几个命令行操作都有哪些&#xff1f;(至少4个) 1.4Java 中是否存在内存溢出、内存泄漏&#xff1f;如何解决&#xff1f;举例说明 1. 内存溢出&#xf…

RocketMQ | 源码分析 | Broker控制器的启动

在分布式消息中间件的领域中&#xff0c;RocketMQ 以其高性能、高可靠性和强大的功能占据着重要的地位。而 Broker 作为 RocketMQ 的核心组件之一&#xff0c;其控制器的启动过程涉及到众多关键环节和复杂的逻辑。理解这个过程对于深入掌握 RocketMQ 的运行机制以及在实际应用中…

从0开始深度学习(22)——从全连接层到卷积

多层感知机在处理图像这种高维数据时&#xff0c;因为模型需要大量的数据来训练这么多参数&#xff0c;会导致巨大的计算成本&#xff0c;还会增加过拟合的风险&#xff0c;所以人们选择使用卷积神经网络 1 不变性 在计算机视觉和深度学习领域&#xff0c;特指模型对输入数据中…

MySQL8.0.40编译安装

近期MySQL发布了8.0.40版本&#xff0c;与之前的版本相比&#xff0c;部分依赖包发生了变化&#xff0c;因此重新编译一版&#xff0c;也便于大家参考。 1. 下载源码 选择对应的版本、选择源码、操作系统 如果没有登录或者没有MySQL官网账号&#xff0c;可以选择只下载 2. 进…

系统性能优化——绑核

简要 绑核正如其名&#xff0c;将线程/进程绑定在一个或多个CPU核心。该技术可以使进程或线程在特定的处理器上运行&#xff0c;而不会被操作系统调度到其他处理器上。这里有两层含义。 如果线程被绑定在指定核心上&#xff0c;则只会在该核心上运行&#xff0c;即使其他核心…

2024年CentOS镜像下载地址,包括CentOS官网、国内镜像下载,超详细也

这里给大家提供了4种镜像下载地址&#xff0c;包括CentOS官方镜像下载、阿里云开源镜像站下载、网易开源镜像下载搜狐开源镜像下载。 1.CentOS官网镜像下载 因为服务器在国外所以打开CentOS官方网站的时候可能会比较慢。大家可以选择后面几种国内镜像下载方式。 1.1进入CentO…

【面试经典150】day 8

#1024程序员节 | 征文# 作为一个未来的程序员&#xff0c;现在我要继续刷题了。 力扣时刻。 目录 1.接雨水 2.罗马数字转整数 3.最后一个单词的长度 4.最长公共前缀 5.反转字符串中的单词 1.接雨水 好好好好好好&#xff0c;一开始就接雨水。我记得接了n次了。。。 痛苦战…

矩阵概念 和 性质

目录 一、矩阵因式分解 二、矩阵在图形学的运用 一、矩阵因式分解 1、先将矩阵化为上三角阵&#xff0c;得到U 2、每个主元列以下元素 主元 得到下三角阵 二、矩阵在图形学的运用 二维移动&#xff1a; 子空间H&#xff1a; 零向量属于H 对H中任意向量u、v&#xff0c;uv…

spyglass关于cdc检测的一处bug

最近在使用22版spyglass的cdc检测功能&#xff0c;发现struct_check的cdc检测实际时存在一些bug的。 构造如下电路&#xff0c;当qualifier和destination信号汇聚时&#xff0c;如果des信号完全将qualifier gate住&#xff0c;sg仍然会报ac_sync。当然此问题可以通过后续funct…

共识算法Raft(day11)

引入 在分布式系统中&#xff0c;为了消除单点提高系统可用性&#xff0c;通常会创建副本来进行容错&#xff0c;但这会带来另一个问题就是&#xff0c;如何保证多个副本之间的数据一致性。 为了解决这个问题&#xff0c;计算机行内就提出了共识算法&#xff0c;它允许多个分…

27.9 调用go-ansible执行playbook拷贝json文件重载采集器

本节重点介绍 : go-ansible执行playbook编写分发重载的playbook编译执行 测试停掉一个节点测试停掉的节点再回来 go-ansible执行playbook 新增 goansiblerun/run.go package goansiblerunimport ("context""github.com/apenella/go-ansible/pkg/execute&qu…

【数学二】多元函数积分学-重积分-二重积分定义、性质、计算

考试要求 1、了解多元函数的概念&#xff0c;了解二元函数的几何意义. 2、了解二元函数的极限与连续的概念&#xff0c;了解有界闭区域上二元连续函数的性质. 3、了解多元函数偏导数与全微分的概念&#xff0c;会求多元复合函数一阶、二阶偏导数&#xff0c;会求全微分&#x…

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

分布式文件系统Minio实战

分布式文件存储系统Minio实战 1、分布式文件系统应用场景1.1 Minio介绍1.1.1 Minio优点 1.2 MinIO的基础概念1.3 纠删码EC&#xff08;Erasure Code&#xff09;1.4 存储形式1.5 存储方案 2、Minio环境搭建2.1 单机部署2.1.1 non-erasure code mode2.1.2 erasure code mode2.1.…

算法题总结(十九)——图论

图论 DFS框架 void dfs(参数) { if (终止条件) {存放结果;return; }for (选择&#xff1a;本节点所连接的其他节点) {处理节点;dfs(图&#xff0c;选择的节点); // 递归回溯&#xff0c;撤销处理结果 } }深搜三部曲 确认递归函数&#xff0c;参数确认终止条件处理目前搜索节…