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

相关文章

PostgreSQL 默认隔离级别的设置

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

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、