系统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,一经查实,立即删除!

相关文章

【常用知识点-Linux】SSH免密登陆

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-12 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 SSH免密登录是一种基于公钥加密技术的安全认证方式&#xff0c;其原理如下&#xff1a; 生成密钥对&#xff1a;客户端生成一对…

树的结构(b,b+树)

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

【25届秋招备战C++】算法篇-排序算法合集

【25届秋招备战C】算法篇-排序算法合集 一、简介二、解题思路三、模板四、参考 一、简介 排序算法是计算机科学中的基本算法之一&#xff0c;用于将一组数据按照特定的顺序&#xff08;升序或降序&#xff09;进行排列。排序算法广泛应用于数据管理和检索系统&#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;…

第一节变量、运算符、表达式、输入与输出

Hello World package org.wyp;public class Main {//定义了一个类Mainpublic static void main(String[] args) {System.out.println("Hello World");} }变量 byte(字节) 01010111 一个有8位二进制数 每一个0/1叫一位,简称为bit 1byte8bit 一个byte就是一个字节,一…

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

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

昇思训练营打卡第二十四天(LSTM+CRF序列标注)

LSTM&#xff08;Long Short-Term Memory&#xff0c;长短时记忆网络&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Hochreiter和Schmidhuber在1997年提出。它旨在解决传统RNN在处理长距离依赖问题时出现的梯度消失和梯度爆炸问题。以下是LST…

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

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

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

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

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

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

nginx代理gitee

背景 若干台agv设备&#xff0c;这些设备都是没有公网的(无法访问百度等)。 一台服务器(ubuntu20.04)有线可以公网&#xff0c;无线可以实现内部通信(agv&#xff0c;plc等设备)。 目的 agv每一次更新代码&#xff0c;拉取代码等都需要切换到有公网的网络&#xff0c;多台agv设…

守望数据边界:sklearn中的离群点检测技术

守望数据边界&#xff1a;sklearn中的离群点检测技术 在数据分析和机器学习项目中&#xff0c;离群点检测是一项关键任务。离群点&#xff0c;又称异常值或离群点&#xff0c;是指那些与其他数据显著不同的观测值。这些点可能由测量误差、数据录入错误或真实的变异性造成。正确…

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

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

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

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

高级前端工程师面试题

HTML/CSS 1. 解释HTML5中的<canvas>元素及其用途。 <canvas>元素用于通过JavaScript绘制图形&#xff0c;比如图表、图像处理等。它提供了一个图形上下文&#xff0c;可以进行2D图形绘制。 2. CSS中display: none和visibility: hidden有什么区别&#xff1f; d…

MySQL 面试真题(带答案)

MySQL 场景面试题 目录 场景1&#xff1a;用户注册和登录系统 1.1 数据库设计1.2 用户注册1.3 用户登录 场景2&#xff1a;订单管理系统 2.1 数据库设计2.2 创建订单2.3 查询订单 场景3&#xff1a;博客系统 3.1 数据库设计3.2 发布文章3.3 评论功能 场景1&#xff1a;用户…

浅析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;如何…

WebSocket 常见的错误

一、连接相关错误 &#xff08;一&#xff09;连接超时 原因&#xff1a;在规定的时间内无法成功建立与服务器的 WebSocket 连接。示例&#xff1a;如果网络状况不佳&#xff0c;或者服务器响应缓慢&#xff0c;导致在客户端设置的连接超时时间内未能完成连接建立的握手过程&am…

在 WebSocket 连接建立之前进行身份验证时,token 应该如何存储

在 WebSocket 连接建立之前进行身份验证时,token 的存储方式有以下几种常见选择: 一、客户端存储 (一)本地存储(LocalStorage) 在现代浏览器中,可以使用 LocalStorage 来存储 token。LocalStorage 是一种键值对形式的存储,数据会一直存储在浏览器中,直到被手动清除或…