10 展讯Sprd设置-电池-AppStateInfoCollector 接口介绍

2024-02-09 20:18

本文主要是介绍10 展讯Sprd设置-电池-AppStateInfoCollector 接口介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. AppStateInfoCollector 接口介绍

由于应用场景调用地方多样,所以该接口主要更新应用状态信息。这里重点 public接口的被调用状况

2. 实例化

package com.android.server.power;public class PowerController {// App state infoprivate AppStateInfoCollector mAppStateInfoCollector;// SystemServer.startOtherServices()public PowerController(Context context, IActivityManager activityManager) {...mAppStateInfoCollector = AppStateInfoCollector.getInstance(mContext);}

3. AppStateInfoCollector 接口介绍

3.1 单例模式调用

    public static AppStateInfoCollector getInstance(Context context) {synchronized (AppStateInfoCollector.class) {if (sInstance == null) {sInstance = new AppStateInfoCollector(context);}return sInstance;}}public AppStateInfoCollector(Context context) {mContext = context;}

3.2 AppStateInfoCollector.reportAppStateEventInfo

更新应用状态事件信息

    // 更新应用状态事件信息// return true: for new app state//     false: for otherspublic boolean reportAppStateEventInfo(String packageName, int userId, int stateEvent) {// 获取应用状态列表ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);//update mAppStateInfoListint index = mAppStateInfoList.indexOfKey(packageName);AppState appState = null;boolean ret = true;if (DEBUG) Slog.d(TAG, "- reportAppStateEventInfo() E -");if (index >= 0) {appState = mAppStateInfoList.valueAt(index);// 更新应用状态appState.updateAppState(stateEvent);ret = false;} else {// 新建一个应用状态appState = buildAppState(packageName, userId, stateEvent);mAppStateInfoList.put(packageName, appState);}return ret;}

3.3 AppStateInfoCollector.reportAppProcStateInfo

更新应用进程状态信息

    // 更新应用进程状态信息// return true: for new app state//     false: for otherspublic boolean reportAppProcStateInfo(String packageName, int uid, int procState) {int userId = UserHandle.getUserId(uid);ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);//update mAppStateInfoListint index = mAppStateInfoList.indexOfKey(packageName);AppState appState = null;boolean ret = true;if (DEBUG) Slog.d(TAG, "- reportAppProcStateInfo() E -");if (index >= 0) {appState = mAppStateInfoList.valueAt(index);// update procStateappState.mProcState = procState;if (uid != appState.mUid) appState.mUid = uid;ret = false;} else {if (DEBUG) Slog.d(TAG, "reportAppProcStateInfo: appName:" + packageName + " uid:" + uid + " is not exist, create it");appState = buildAppState(packageName, userId, Event.NONE);mAppStateInfoList.put(packageName, appState);}return ret;}

3.4 获取某个应用状态 AppStateInfoCollector.getAppState

根据uid或者包名,获取应用状态,非常实用,方便上层调用

    public AppState getAppState(String pkgName, int userId) {ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);int index = mAppStateInfoList.indexOfKey(pkgName);if (index >= 0) {AppState appState = mAppStateInfoList.valueAt(index);return appState;} else {return null;}}public AppState getAppState(int uid) {int userId = UserHandle.getUserId(uid);ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);for (int i=0;i<mAppStateInfoList.size();i++) {AppState appState = mAppStateInfoList.valueAt(i);if (appState.mUid == uid)return appState;}return null;}

3.5 AppStateInfoCollector.getCountOfActiveLaunchedApp

获取当前被启动的进程数量

    // to sync with mAppStateInfoList if this api is called by other thread ??public int getCountOfActiveLaunchedApps(int userId) {ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);int count = 0;for (int i=0;i<mAppStateInfoList.size();i++) {AppState appState = mAppStateInfoList.valueAt(i);if (appState.mLaunchCount > 0&& appState.mProcState != ActivityManager.PROCESS_STATE_CACHED_EMPTY&& appState.mProcState != ActivityManager.PROCESS_STATE_NONEXISTENT) {count++;}}return count;}

3.6 更新输入法状态信息

    // update the Input Method identify state of this apppublic void updateAppInputMethodState(String pkgName, boolean isInputMethod, int userId) {ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);int index = mAppStateInfoList.indexOfKey(pkgName);if (index >= 0) {AppState appState = mAppStateInfoList.valueAt(index);appState.mIsEnabledInputMethod = isInputMethod;}}// update the Input Method identify state of this apppublic void setDefaultInputMethodApp(String pkgName, int userId) {ArrayMap<String, AppState> mAppStateInfoList = getAppStateInfoList(userId);String mDefaultIMEAppName =  mDefaultIMEAppNameForUsers.get(userId);if (mDefaultIMEAppName != null&& mDefaultIMEAppName.equals(pkgName)) {return;}// clear orignalif (mDefaultIMEAppName != null) {int index = mAppStateInfoList.indexOfKey(mDefaultIMEAppName);if (index >= 0) {AppState appState = mAppStateInfoList.valueAt(index);appState.mIsDefaultInputMethod = false;}}// set newint index = mAppStateInfoList.indexOfKey(pkgName);if (index >= 0) {AppState appState = mAppStateInfoList.valueAt(index);appState.mIsDefaultInputMethod = true;}mDefaultIMEAppName = pkgName;mDefaultIMEAppNameForUsers.put(userId, mDefaultIMEAppName);}// if this app is a input Methodprivate boolean isEnabledIMEApp(String pkgName){if (pkgName == null) return false;IInputMethodManager service = IInputMethodManager.Stub.asInterface(ServiceManager.getService(Context.INPUT_METHOD_SERVICE));List<InputMethodInfo> inputMethods;try {inputMethods = service.getEnabledInputMethodList();} catch (RemoteException e) {return false;}if (inputMethods == null || inputMethods.size() == 0) return false;for (InputMethodInfo info : inputMethods){if (info == null || info.getPackageName() == null) continue;if (info.getPackageName().equals(pkgName)) return true;}return false;}

3.7 更新进程状态信息

    public void updateUidState(int uid, int uidState) {synchronized (mUidStateLock) {final int oldUidState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);if (oldUidState != uidState) {// state changed, push updated rulesmUidState.put(uid, uidState);}}}public void removeUidState(int uid) {synchronized (mUidStateLock) {final int index = mUidState.indexOfKey(uid);if (index >= 0) {final int oldUidState = mUidState.valueAt(index);mUidState.removeAt(index);}}}

3.8 创建一个新的应用状态

    private AppState buildAppState(String packageName, int userId, int stateEvent) {ApplicationInfo app = null;int uid = 0;int procState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;int flags = 0;try {app = AppGlobals.getPackageManager().getApplicationInfo(packageName, 0, userId);} catch (RemoteException e) {// can't happen; package manager is process-local}if (app != null) {uid = app.uid;flags = app.flags;synchronized (mUidStateLock) {procState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);}}AppState retVal = new AppState(packageName, userId, uid, stateEvent, procState, flags);// check if is input methodretVal.mIsEnabledInputMethod = isEnabledIMEApp(packageName);//if (DEBUG) Slog.d(TAG, "- buildAppState() :" + packageName);return retVal;}

3.9 获取应用状态列表

    public ArrayMap<String, AppState> getAppStateInfoList(int userId) {ArrayMap<String, AppState> mAppStateInfoList = mUserAppStateInfoList.get(userId);if (mAppStateInfoList == null) {mAppStateInfoList = new ArrayMap<>();mUserAppStateInfoList.put(userId, mAppStateInfoList);}return mAppStateInfoList;}

即上述 reportAppStateEventInfo 和 reportAppProcStateInfo 和 updateUidState 作为外部调用接口,可以间接更新应用状态AppState

这篇关于10 展讯Sprd设置-电池-AppStateInfoCollector 接口介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695194

相关文章

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2