android5.1BatteryService深入分析

来源:互联网 发布:js websocket链接不了 编辑:程序博客网 时间:2024/06/16 03:52


先贴一张类与类之间的关系图:

构造函数只是从资源中取一些值。

    public BatteryService(Context context) {        super(context);        mContext = context;        mHandler = new Handler(true /*async*/);        mLed = new Led(context, getLocalService(LightsManager.class));        mBatteryStats = BatteryStatsService.getService();        mCriticalBatteryLevel = mContext.getResources().getInteger(                com.android.internal.R.integer.config_criticalBatteryWarningLevel);        mLowBatteryWarningLevel = mContext.getResources().getInteger(                com.android.internal.R.integer.config_lowBatteryWarningLevel);        mLowBatteryCloseWarningLevel = mLowBatteryWarningLevel + mContext.getResources().getInteger(                com.android.internal.R.integer.config_lowBatteryCloseWarningBump);        mShutdownBatteryTemperature = mContext.getResources().getInteger(                com.android.internal.R.integer.config_shutdownBatteryTemperature);        // watch for invalid charger messages if the invalid_charger switch exists        if (new File("/sys/devices/virtual/switch/invalid_charger/state").exists()) {            mInvalidChargerObserver.startObserving(                    "DEVPATH=/devices/virtual/switch/invalid_charger");        }    }

onstart函数将电池监听注册到底层去。

    @Override    public void onStart() {        IBinder b = ServiceManager.getService("batteryproperties");        final IBatteryPropertiesRegistrar batteryPropertiesRegistrar =                IBatteryPropertiesRegistrar.Stub.asInterface(b);        try {            //电池监听,注册到底层。当底层电量改变会调用此监听。然后执行update            batteryPropertiesRegistrar.registerListener(new BatteryListener());        } catch (RemoteException e) {            // Should never happen.        }                publishBinderService("battery", new BinderService());        publishLocalService(BatteryManagerInternal.class, new LocalService());    }

将本地接口publish出去。

    private final class LocalService extends BatteryManagerInternal {        @Override        public boolean isPowered(int plugTypeSet) {            synchronized (mLock) {                return isPoweredLocked(plugTypeSet);            }        }        @Override        public int getPlugType() {            synchronized (mLock) {                return mPlugType;            }        }        @Override        public int getBatteryLevel() {            synchronized (mLock) {                return mBatteryProps.batteryLevel;            }        }        @Override        public boolean getBatteryLevelLow() {            synchronized (mLock) {                return mBatteryLevelLow;            }        }        @Override        public int getInvalidCharger() {            synchronized (mLock) {                return mInvalidCharger;            }        }    }

当底层有信息上来,会调用update函数更新BatteryService中的状态值。

    private void update(BatteryProperties props) {        synchronized (mLock) {            if (!mUpdatesStopped) {                mBatteryProps = props;                // Process the new values.                processValuesLocked(false);            } else {                mLastBatteryProps.set(props);            }        }    }


接下来分析主函数processValuesLocked:

 private void processValuesLocked(boolean force) {        boolean logOutlier = false;        long dischargeDuration = 0;        mBatteryLevelCritical = (mBatteryProps.batteryLevel <= mCriticalBatteryLevel);        //解析充电类型        if (mBatteryProps.chargerAcOnline) {            mPlugType = BatteryManager.BATTERY_PLUGGED_AC;        } else if (mBatteryProps.chargerUsbOnline) {            mPlugType = BatteryManager.BATTERY_PLUGGED_USB;        } else if (mBatteryProps.chargerWirelessOnline) {            mPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS;        } else {            mPlugType = BATTERY_PLUGGED_NONE;        }        // Let the battery stats keep track of the current level.        try {            mBatteryStats.setBatteryState(mBatteryProps.batteryStatus, mBatteryProps.batteryHealth,                    mPlugType, mBatteryProps.batteryLevel, mBatteryProps.batteryTemperature,                    mBatteryProps.batteryVoltage);        } catch (RemoteException e) {            // Should never happen.        }        //没电了        shutdownIfNoPowerLocked();        //温度过高        shutdownIfOverTempLocked();        //force用来控制是否第一次调用        if (force || (mBatteryProps.batteryStatus != mLastBatteryStatus ||                mBatteryProps.batteryHealth != mLastBatteryHealth ||                mBatteryProps.batteryPresent != mLastBatteryPresent ||                mBatteryProps.batteryLevel != mLastBatteryLevel ||                mPlugType != mLastPlugType ||                mBatteryProps.batteryVoltage != mLastBatteryVoltage ||                mBatteryProps.batteryTemperature != mLastBatteryTemperature ||                mInvalidCharger != mLastInvalidCharger)) {            if (mPlugType != mLastPlugType) {                if (mLastPlugType == BATTERY_PLUGGED_NONE) {                                     //不充电到充电                    if (mDischargeStartTime != 0 && mDischargeStartLevel != mBatteryProps.batteryLevel) {                        dischargeDuration = SystemClock.elapsedRealtime() - mDischargeStartTime;                        logOutlier = true;                        EventLog.writeEvent(EventLogTags.BATTERY_DISCHARGE, dischargeDuration,                                mDischargeStartLevel, mBatteryProps.batteryLevel);                        // make sure we see a discharge event before logging again                        mDischargeStartTime = 0;                    }                } else if (mPlugType == BATTERY_PLUGGED_NONE) {                    // 刚开始充电                    mDischargeStartTime = SystemClock.elapsedRealtime();                    mDischargeStartLevel = mBatteryProps.batteryLevel;                }            }            if (mBatteryLevelCritical && !mLastBatteryLevelCritical &&                    mPlugType == BATTERY_PLUGGED_NONE) {                // We want to make sure we log discharge cycle outliers                // if the battery is about to die.                dischargeDuration = SystemClock.elapsedRealtime() - mDischargeStartTime;                logOutlier = true;            }            if (!mBatteryLevelLow) {                // Should we now switch in to low battery mode?                if (mPlugType == BATTERY_PLUGGED_NONE                        && mBatteryProps.batteryLevel <= mLowBatteryWarningLevel) {                    mBatteryLevelLow = true;                }            } else {                // Should we now switch out of low battery mode?                if (mPlugType != BATTERY_PLUGGED_NONE) {                    mBatteryLevelLow = false;                } else if (mBatteryProps.batteryLevel >= mLowBatteryCloseWarningLevel)  {                    mBatteryLevelLow = false;                } else if (force && mBatteryProps.batteryLevel >= mLowBatteryWarningLevel) {                    // If being forced, the previous state doesn't matter, we will just                    // absolutely check to see if we are now above the warning level.                    mBatteryLevelLow = false;                }            }            //发送电池状态变化的广播            sendIntentLocked();            // Separate broadcast is sent for power connected / not connected            // since the standard intent will not wake any applications and some            // applications may want to have smart behavior based on this.            if (mPlugType != 0 && mLastPlugType == 0) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        Intent statusIntent = new Intent(Intent.ACTION_POWER_CONNECTED);                        statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);                        mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);                    }                });            }            else if (mPlugType == 0 && mLastPlugType != 0) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        Intent statusIntent = new Intent(Intent.ACTION_POWER_DISCONNECTED);                        statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);                        mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);                    }                });            }            if (shouldSendBatteryLowLocked()) {                mSentLowBatteryBroadcast = true;                mHandler.post(new Runnable() {                    @Override                    public void run() {                        Intent statusIntent = new Intent(Intent.ACTION_BATTERY_LOW);                        statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);                        mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);                    }                });            } else if (mSentLowBatteryBroadcast && mLastBatteryLevel >= mLowBatteryCloseWarningLevel) {                mSentLowBatteryBroadcast = false;                mHandler.post(new Runnable() {                    @Override                    public void run() {                        Intent statusIntent = new Intent(Intent.ACTION_BATTERY_OKAY);                        statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);                        mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);                    }                });            }            //更新电池的LED            mLed.updateLightsLocked();            // This needs to be done after sendIntent() so that we get the lastest battery stats.            if (logOutlier && dischargeDuration != 0) {                logOutlierLocked(dischargeDuration);            }            mLastBatteryStatus = mBatteryProps.batteryStatus;            mLastBatteryHealth = mBatteryProps.batteryHealth;            mLastBatteryPresent = mBatteryProps.batteryPresent;            mLastBatteryLevel = mBatteryProps.batteryLevel;            mLastPlugType = mPlugType;            mLastBatteryVoltage = mBatteryProps.batteryVoltage;            mLastBatteryTemperature = mBatteryProps.batteryTemperature;            mLastBatteryLevelCritical = mBatteryLevelCritical;            mLastInvalidCharger = mInvalidCharger;        }    }


1 0
原创粉丝点击