SystemUI PowerUI流程

PowerUI启动流程梳理

  • 简介

PowerUISystemUI控制电量提醒的模块,包括低电量提醒、危急电量关机提醒、高温关机提醒、省电模式等功能如果收到监听的时间则用Notification systemUI显示通知。

二、代码控制流程

启动初始化

SystemUI 启动时会加载众多功能模块其中就包含 PowerUI ,其会直接调用 PowerUI.start()

  1. public void start() {
  2.     // 获取  PowerManager 用于获取电池相关信息  
  3.     mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);  
  4.     // 获取自启动以来的毫秒数
  5.     mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();  
  6.     mWarnings = Dependency.get(WarningsUI.class);  
  7.     // 和混合通知相关,相关功能平台默认是关闭的
  8.     mEnhancedEstimates = Dependency.get(EnhancedEstimates.class);  
  9.     mLastConfiguration.setTo(mContext.getResources().getConfiguration()); 
  10.  
  11.     ContentObserver obs = new ContentObserver(mHandler) {  
  12.         @Override  
  13.         public void onChange(boolean selfChange) {  
  14.             updateBatteryWarningLevels();  
  15.         }  
  16.     };  
  17.     // 监测低电量阀值的改变
  18.     final ContentResolver resolver = mContext.getContentResolver();  
  19.     resolver.registerContentObserver(Settings.Global.getUriFor(  
  20.             Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),  
  21.             false, obs, UserHandle.USER_ALL);  
  22.     // 更新电量警告
  23.     updateBatteryWarningLevels();  
  24.   
  25.     // 监听相关广播
  26.     mReceiver.init();   
  27.     // 如果上次因过热而关机则告知用户  
  28.     showWarnOnThermalShutdown();  
  29.   
  30.    //注册观察者以配置 mEnableSkinTemperatureWarning 并在设置更改时执行温度过过热事件侦听器的注册  
  31.     resolver.registerContentObserver(  
  32.             Settings.Global.getUriFor(Settings.Global.SHOW_TEMPERATURE_WARNING),  
  33.             false /*notifyForDescendants*/,  
  34.             new ContentObserver(mHandler) {  
  35.                 @Override  
  36.                 public void onChange(boolean selfChange) {  
  37.                     doSkinThermalEventListenerRegistration();  
  38.                 }  
  39.             });  
  40.     //注册观察者以配置 mEnableUsbTemperatureAlarm 并在设置更改时执行 USB 过热事件监听器的注册  
  41.     resolver.registerContentObserver(  
  42.             Settings.Global.getUriFor(Settings.Global.SHOW_USB_TEMPERATURE_ALARM),  
  43.             false /*notifyForDescendants*/,  
  44.             new ContentObserver(mHandler) {  
  45.                 @Override  
  46.                 public void onChange(boolean selfChange) {  
  47.                     doUsbThermalEventListenerRegistration();  
  48.                 }  
  49.             });  
  50.     // 初始化温度阀值高温警告
  51.     initThermalEventListeners();  
  52.     mCommandQueue.addCallback(this);  
  53. }  

低电量警告

updateBatteryWarningLevels

  1. void updateBatteryWarningLevels() {  
  2. // 获取系统配置的危急电量值,默认:5 
  3.     int critLevel = mContext.getResources().getInteger(  
  4.             com.android.internal.R.integer.config_criticalBatteryWarningLevel);  
  5. // 获取系统配置的低电量值,默认:15  
  6.     int warnLevel = mContext.getResources().getInteger(  
  7.             com.android.internal.R.integer.config_lowBatteryWarningLevel);  
  8.   
  9.     if (warnLevel < critLevel) {  
  10.         warnLevel = critLevel;  
  11.     }  
  12.   
  13.     mLowBatteryReminderLevels[0] = warnLevel;  
  14.     mLowBatteryReminderLevels[1] = critLevel;  
  15. // 获取系统配置的关闭低电量警告状态的电量值,默认:2015+5
  16.     mLowBatteryAlertCloseLevel = mLowBatteryReminderLevels[0]  
  17.             + mContext.getResources().getInteger(  
  18.                     com.android.internal.R.integer.config_lowBatteryCloseWarningBump);  
  19. }  

电池相关广播监听 

  1. final class Receiver extends BroadcastReceiver {  
  2.   
  3.     private boolean mHasReceivedBattery = false;  
  4.   
  5.     public void init() {  
  6.         // Register for Intent broadcasts for...  
  7.         IntentFilter filter = new IntentFilter();  
  8.         // 省电模式改变
  9.         filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);  
  10.         // 电池状态改变
  11.         filter.addAction(Intent.ACTION_BATTERY_CHANGED);  
  12.          // 开关屏
  13.         filter.addAction(Intent.ACTION_SCREEN_OFF);  
  14.         filter.addAction(Intent.ACTION_SCREEN_ON);  
  15.         // 切换用户
  16.         filter.addAction(Intent.ACTION_USER_SWITCHED);  
  17.         mBroadcastDispatcher.registerReceiverWithHandler(this, filter, mHandler);  
  18.         //强制获取初始值。在获取信息的 API 之前依赖 Sticky 行为
  19.         if (!mHasReceivedBattery) {  
  20.             // Get initial state  
  21.             Intent intent = mContext.registerReceiver(  
  22.                     null,  
  23.                     new IntentFilter(Intent.ACTION_BATTERY_CHANGED)  
  24.             );  
  25.             if (intent != null) {  
  26.                 onReceive(mContext, intent);  
  27.             }  
  28.         }  
  29.     }  
  30.   
  31.     @Override  
  32.     public void onReceive(Context context, Intent intent) {  
  33.         String action = intent.getAction();  
  34.         if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {  
  35.             ThreadUtils.postOnBackgroundThread(() -> {  
  36.                 if (mPowerManager.isPowerSaveMode()) {  
  37.                          开启省电模式则关闭低电量警告
  38.                     mWarnings.dismissLowBatteryWarning();  
  39.                 }  
  40.             });  
  41.         } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {  
  42.             ……
  43.             mLastBatteryStateSnapshot = mCurrentBatteryStateSnapshot;  
  44.   
  45.             final boolean plugged = mPlugType != 0;  
  46.              // 根据当前电量与危急电量、低电量、关闭低电量警告电量比较判断当前所处状态
  47.             final boolean oldPlugged = oldPlugType != 0;  
  48.   
  49.             int oldBucket = findBatteryLevelBucket(oldBatteryLevel);  
  50.             int bucket = findBatteryLevelBucket(mBatteryLevel);  
  51.   
  52.             // Show the correct version of low battery warning if needed  
  53.             if (mLastShowWarningTask != null) {  
  54.                 mLastShowWarningTask.cancel(true);  
  55.                 if (DEBUG) {  
  56.                     Slog.d(TAG, "cancelled task");  
  57.                 }  
  58.             }  
  59.             mLastShowWarningTask = ThreadUtils.postOnBackgroundThread(() -> {            // 判断是否要显示低电量警告
  60.                 maybeShowBatteryWarningV2(  
  61.                         plugged, bucket);  
  62.             });  
  63.   
  64.         } else if ……
  65.     }  

高温警告

  1. private void initThermalEventListeners() {  
  2.     doSkinThermalEventListenerRegistration();  
  3.     doUsbThermalEventListenerRegistration();  
  4. }  

synchronized void doSkinThermalEventListenerRegistration() {

    final boolean oldEnableSkinTemperatureWarning = mEnableSkinTemperatureWarning;

    boolean ret = false;

    // 是否开启高温警告,默认关闭  

    mEnableSkinTemperatureWarning = Settings.Global.getInt(mContext.getContentResolver(),

        Settings.Global.SHOW_TEMPERATURE_WARNING,   mContext.getResources().getInteger(R.integer.config_showTemperatureWarning)) != 0;

  

    if (mEnableSkinTemperatureWarning != oldEnableSkinTemperatureWarning) {

        try {

            if (mSkinThermalEventListener == null) {

                mSkinThermalEventListener = new SkinThermalEventListener();

            }

            if (mThermalService == null) {

                mThermalService = IThermalService.Stub.asInterface(

                    ServiceManager.getService(Context.THERMAL_SERVICE));

            }

            if (mEnableSkinTemperatureWarning) {

                ret = mThermalService.registerThermalEventListenerWithType(

                        mSkinThermalEventListener, Temperature.TYPE_SKIN);

            } else {

                ret = mThermalService.unregisterThermalEventListener(mSkinThermalEventListener);

            }

        } catch (RemoteException e) {

            Slog.e(TAG, "Exception while (un)registering skin thermal event listener.", e);

        }

  

        if (!ret) {

            mEnableSkinTemperatureWarning = !mEnableSkinTemperatureWarning;

            Slog.e(TAG, "Failed to register or unregister skin thermal event listener.");

        }

    }

}

  1. final class SkinThermalEventListener extends IThermalEventListener.Stub {  
  2.     @Override public void notifyThrottling(Temperature temp) {  
  3.         int status = temp.getStatus();  
  4.   
  5.         if (status >= Temperature.THROTTLING_EMERGENCY) {  
  6.             if (!mStatusBarLazy.get().isDeviceInVrMode()) {  
  7.                 mWarnings.showHighTemperatureWarning();  
  8.                 Slog.d(TAG, "SkinThermalEventListener: notifyThrottling was called "  
  9.                         + ", current skin status = " + status  
  10.                         + ", temperature = " + temp.getValue());  
  11.             }  
  12.         } else {  
  13.             mWarnings.dismissHighTemperatureWarning();  
  14.         }  
  15.     }  
  16. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值