系统Doze白名单常用接口

  1. 获取Doze白名单列表:DeviceIdleController.getUserPowerWhitelist
  2. 是否Doze白名单:DeviceIdleController.isPowerSaveWhitelistApp
  3. Doze白名单变化广播:PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED
  4. 设置Doze白名单:DeviceIdleController.addPowerSaveWhitelistApp
package com.android.server.doze;import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.IDeviceIdleController;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.ArrayMap;import com.android.server.LocalServices;
import com.android.server.usage.AppStandbyConfig;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class UserWhiteList {public static final String TAG = "UserWhiteList";private static final ArrayMap<String, IWhiteListChangedListener> mListeners = new ArrayMap<>();private final IDeviceIdleController mDeviceIdleController;private final UsageStatsManagerInternal mUsageStatsService;private static final List<String> mWhiteAllList = new ArrayList<>();//监听的回调:private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (null == intent) {return;}switch (intent.getAction()) {case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:synchronized (mListeners) {onUserWhiteListChanged();for (Map.Entry<String, IWhiteListChangedListener> entity : mListeners.entrySet()) {IWhiteListChangedListener lsr = entity.getValue();if (lsr != null) {lsr.onUserWhiteListChanged();}}List<String> dozeWhiteList = getUserPowerWhitelist(true);if (null != dozeWhiteList) {String dozeWhiteListInfo = "ACTION_POWER_SAVE_WHITELIST_CHANGED " +"onUserWhiteListChanged " + dozeWhiteList;PowerLog.getInstance().writePowerFeatureLog(dozeWhiteListInfo);}}break;case Intent.ACTION_PACKAGE_ADDED:final String packageName = intent.getData().getEncodedSchemeSpecificPart();if (null == packageName) {break;}// keep pre doze config while app update eventif (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {break;}// add app to doze white list while app install eventif (AppStandbyConfig.isDozePkgWhiteList(packageName)&& !isPowerSaveWhitelistApp(packageName)) {addPowerSaveWhitelistApp(packageName);String whiteAppInfo = "ACTION_PACKAGE_ADDED " +"addPowerSaveWhitelistApp " + "packageName:" + packageName;Nslog.d(TAG_DOZE, TAG, whiteAppInfo);PowerLog.getInstance().writePowerFeatureLog(whiteAppInfo);}break;default:break;}}};public UserWhiteList(Context context, Handler handler) {mDeviceIdleController = IDeviceIdleController.Stub.asInterface(ServiceManager.getService("deviceidle"));mUsageStatsService = LocalServices.getService(UsageStatsManagerInternal.class);IntentFilter intentFilter = new IntentFilter(PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);context.registerReceiver(mBroadcastReceiver, intentFilter,null, handler);intentFilter = new IntentFilter();intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);intentFilter.addDataScheme("package");context.registerReceiver(mBroadcastReceiver, intentFilter,null, handler);Nslog.d(TAG_DOZE, TAG, "registerReceiver success");}public void registerWhiteListChangedListener(String feature, IWhiteListChangedListener listener) {synchronized (mListeners) {if (listener != null && feature != null) {mListeners.put(feature, listener);}}}public void onUserWhiteListChanged() {List<String> whitelist = getUserPowerWhitelist(true);mWhiteAllList.clear();mWhiteAllList.addAll(whitelist);}public List<String> getUserPowerWhitelist() {return mWhiteAllList;}/*** 获取所有白名单包名*/public List<String> getUserPowerWhitelist(boolean all) {List<String> whitelistPkgs = new ArrayList<>();try {String[] pkgs = mDeviceIdleController.getUserPowerWhitelist();for (int i = 0; i < pkgs.length; i++) {if (!all && AppStandbyConfig.isDozePkgWhiteList(pkgs[i])) {continue;}whitelistPkgs.add(pkgs[i]);}} catch (RemoteException e) {Nslog.d(TAG_DOZE, TAG, e.toString());}return whitelistPkgs;}/*** 判断是否白名单*/public boolean isPowerSaveWhitelistApp(String pkg) {boolean isWhite = false;try {isWhite = mDeviceIdleController.isPowerSaveWhitelistApp(pkg);} catch (RemoteException e) {Nslog.d(TAG_DOZE, TAG, e.toString());}return isWhite;}/*** 获取白名单大小, setting可使用这个方法*/public int getAppIdUserWhitelistSize() {try {int[] uids = mDeviceIdleController.getAppIdUserWhitelist();return uids.length;} catch (RemoteException e) {Nslog.d(TAG_DOZE, TAG, e.toString());}return 0;}public List<String> getRunningAppBuckets(List<String> run) {if (run == null) {return null;}List<String> list = new ArrayList<>();for (int i = 0; i < run.size(); i++) {int bucket = -1;if (null != mUsageStatsService) {bucket = mUsageStatsService.getAppStandbyBucket(run.get(i), 0, SystemClock.elapsedRealtime());}if (bucket == UsageStatsManager.STANDBY_BUCKET_RESTRICTED) {list.add(run.get(i));}}return list;}public boolean isInRestrictedPackage(String pkg) {boolean isRestricted = (UsageStatsManager.STANDBY_BUCKET_RESTRICTED <= getAppBucket(pkg));return isRestricted;}public int getAppBucket(String pkg) {int bucket = -1;if (null != mUsageStatsService) {bucket = mUsageStatsService.getAppStandbyBucket(pkg, 0, SystemClock.elapsedRealtime());}return bucket;}private void addPowerSaveWhitelistApp(String pkgName) {try {if (null == mDeviceIdleController) {return;}mDeviceIdleController.addPowerSaveWhitelistApp(pkgName);} catch (RemoteException e) {Nslog.d(TAG_DOZE, TAG, e.toString());}}}

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

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

相关文章

树的结构(b,b+树)

无论线性表&#xff0c;栈还是队列&#xff0c;都是一对一&#xff0c;查询的时候&#xff0c;效率较低&#xff0c;数据量比较的大的情况 1.树的定义 一种数据结构&#xff0c;有层次关系的集合&#xff0c;根朝上&#xff0c;叶朝下 除了根节点外&#xff0c;每个子节点都…

论文翻译:Large Language Models for Education: A Survey and Outlook

https://arxiv.org/abs/2403.18105 目录 教育领域的大型语言模型&#xff1a;一项调查和展望摘要1. 引言2. 教育应用中的LLM2.1 概述2.2 学习辅助2.2.1 问题解决&#xff08;QS&#xff09; 2.2.2 错误纠正&#xff08;EC&#xff09;2.2.3 困惑助手&#xff08;CH&#xff09;…

解决elementUI列表的疑难杂症,排序显示错乱的问题

大家好&#xff0c;在使用elementUI表格时&#xff0c;有时会出现一些意料之外的问题&#xff0c;比如数据排序正常但表格显示、排序错乱等。在网上搜索后一般有2种解决方法&#xff1a;1.给表格每一项的el-table-column添加唯一的id用于区分。2.给表格每一项的el-table-column…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素&#xff08;COOH-PEG-Biotin&#xff09;是一种常见的生物分子聚合物&#xff0c;具有多种应用&#xff0c;特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析&#xff1a; 一、基本信息 名称&#xff1a;羧基聚乙二醇生物素&#x…

数据结构:链表详解 (c++实现)

前言 对于数据结构的线性表&#xff0c;其元素在逻辑结构上都是序列关系&#xff0c;即数据元素之间有前驱和后继关系。 但在物理结构上有两种存储方式&#xff1a; 顺序存储结构&#xff1a; 使用此结构的线性表也叫 顺序表物理存储上是连续的&#xff0c;因此可以随机访问…

电压反馈型运算放大器的增益和带宽

简介 本教程旨在考察标定运算放大器的增益和带宽的常用方法。需要指出的是&#xff0c;本讨论适用于电压反馈(VFB)型运算放大器。 开环增益 与理想的运算放大器不同&#xff0c;实际的运算放大器增益是有限的。开环直流增益(通常表示为AVOL)指放大器在反馈环路未闭合时的增益…

借人工智能之手,编织美妙歌词篇章

在音乐的领域中&#xff0c;歌词宛如璀璨的明珠&#xff0c;为旋律增添了无尽的魅力和情感深度。然而&#xff0c;对于许多创作者来说&#xff0c;编织出美妙动人的歌词并非易事。但如今&#xff0c;随着科技的飞速发展&#xff0c;人工智能为我们带来了全新的创作可能。 “妙…

Cornerstone3D导致浏览器崩溃的踩坑记录

WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost ⛳️ 问题描述 在使用vue3vite重构Cornerstone相关项目后&#xff0c;在Mac本地运行良好&#xff0c;但是部署测试环境后&#xff0c;在window系统的Chrome浏览器中切换页面会导致页面崩溃。查看Chrome的任务管理器&am…

浅析Kafka Streams消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题&#xff1a;《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源&#xff1a;Glasgow大学&#xff1b;爱丁堡大学 连接&#xff1a;https://arxiv.org/abs/2406.13099 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何…

Spring Security学习笔记(一)Spring Security架构原理

前言&#xff1a;本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 Spring Security中文文档&#xff1a;https://springdoc.cn/spring-security/index.html 一、什么是Spring Security Spring Security是一个安全控制相关的java框架&#xff0c;它提供了一套全…

海外ASO:iOS与谷歌优化的相同点和区别

海外ASO是针对iOS的App Store和谷歌的Google Play这两个主要海外应用商店进行的优化过程&#xff0c;两个不同的平台需要采取不同的优化策略&#xff0c;以下是对iOS优化和谷歌优化的详细解析&#xff1a; 一、iOS优化&#xff08;App Store&#xff09; 1、关键词覆盖 选择关…

用node.js写一个简单的图书管理界面——功能:添加,删除,修改数据

涉及到的模块&#xff1a; var fs require(‘fs’)——内置模块 var ejs require(‘ejs’)——第三方模块 var mysql require(‘mysql’)——第三方模块 var express require(‘express’)——第三方模块 var bodyParser require(‘body-parser’)——第三方中间件 需要…

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)

1. 项目概述 随着物联网技术的蓬勃发展&#xff0c;智能家居正逐步融入人们的日常生活。然而&#xff0c;市面上琳琅满目的智能家居设备通常采用不同的通信协议&#xff0c;导致不同品牌设备之间难以实现互联互通。为了解决这一难题&#xff0c;本文设计了一种基于STM32的多协…

ant design form动态增减表单项Form.List如何进行动态校验规则

项目需求&#xff1a; 在使用ant design form动态增减表单项Form.List时&#xff0c;Form.List中有多组表单项&#xff0c;一组中的最后一个表单项的校验规则是动态的&#xff0c;该组为最后一组时&#xff0c;最后一个表单项是非必填项&#xff0c;其他时候为必填项。假设动态…

docker inspect 如何提取容器的ip和端口 网络信息?

目录 通过原生Linux命令过滤找到IP 通过jq工具找到IP 使用docker -f 的过滤&#xff08;模板&#xff09; 查找端口映射信息 查看容器内部细节 docker inspect 容器ID或容器名 通过原生Linux命令过滤找到IP 通过jq工具找到IP jq 是一个轻量级且灵活的命令行工具&#xf…

(视频演示)基于OpenCV的实时视频跟踪火焰识别软件V1.0源码及exe下载

本文介绍了基于OpenCV的实时视频跟踪火焰识别软件&#xff0c;该软件通过先进的图像处理技术实现对实时视频中火焰的检测与跟踪&#xff0c;同时支持导入图片进行火焰识别。主要功能包括相机选择、实时跟踪和图片模式。软件适用于多种场合&#xff0c;用于保障人民生命财产安全…

OpenGL笔记二之glad加载opengl函数以及opengl-API(函数)初体验

OpenGL笔记二之glad加载opengl函数以及opengl-API(函数)初体验 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记二之glad加载opengl函数以及opengl-API(函数)初体验1.运行2.重点3.目录结构4.main.cpp5.CMakeList.txt 1.运行 2.重点 3.目录结构 01_GLFW_WI…

Python-PLAXIS自动化建模技术与典型岩土工程

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多软件都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 搭建自己的Plaxis模型&#xff…

设计模式的七大原则

1.单一职责原则 单一职责原则(Single responsibility principle)&#xff0c;即一个类应该只负责一项职责。如类A负责两个不同职责&#xff1a;职责1&#xff0c;职责2。当职责1需求变更而改变A时&#xff0c;可能造成职责2执行错误&#xff0c;所以需要将类A的粒度分解为A1、…