Android 11 无线充电动画、铃声及问题分析

本文详细分析了Android 11中无线充电动画和铃声的流程,从PowerManagerService的updateIsPoweredLocked方法开始,描述了如何播放声音和显示动画。同时,文章探讨了两个问题:1) 手机在无线充电底座上偶尔不亮屏;2) 短距离抬起放下设备时无充电动画和提示音。通过对代码和逻辑的深入研究,指出了问题可能存在的原因,并给出了分析方向。
摘要由CSDN通过智能技术生成

Android 充电的方式有三种:电源充电,USB充电,无线充电,其中原生实现了无线充电的动画,以及相关提示音,无线充电动画的起始位置则是从PowerManagerService开始

流程分析

1. PowerManagerService

在PowerManagerService中有这样一个方法updateIsPoweredLocked,在充电状态发生改变时都会进入到该方法,而无线充电的处理逻辑也在此方法中

private void updateIsPoweredLocked(int dirty) {

    if ((dirty & DIRTY_BATTERY_STATE) != 0) {

        final boolean wasPowered = mIsPowered;

        final int oldPlugType = mPlugType;

        final boolean oldLevelLow = mBatteryLevelLow;

        //BatteryManagerInternal的实现类再BatteryService中,isPowered中查看当前state是否

        //为AC,USB,Wireless,如果是则返回true

        mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);

        //当前插入的类型 AC,USB,Wireless

        mPlugType = mBatteryManagerInternal.getPlugType();

        //电池电量

        mBatteryLevel = mBatteryManagerInternal.getBatteryLevel();

        //电量小于等于15则为低电状态

        mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow();

        if (wasPowered != mIsPowered || oldPlugType != mPlugType) {

            mDirty |= DIRTY_IS_POWERED;



            //更新无线充电的状态,此值决定当前是否为无线充电

            final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(

                    mIsPowered, mPlugType);



            // 将插拔设备视为用户行为。当用户插上或拔出设备时,它会立即关闭,

            // 这让用户感到不安。有些设备在插入或拔出时也会唤醒设备,因为它们

            // 没有充电指示灯。

            final long now = mClock.uptimeMillis();

            //判断当前状态是否应该亮屏,插入USB充电或无线充电时会亮屏

            //google 在此方法中做了一些错误状态规避

            if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType,

                    dockedOnWirelessCharger)) {

                //去点亮屏幕

                wakeUpNoUpdateLocked(now, PowerManager.WAKE_REASON_PLUGGED_IN,

                        "android.server.power:PLUGGED:" + mIsPowered, Process.SYSTEM_UID,

                        mContext.getOpPackageName(), Process.SYSTEM_UID);

            }

            userActivityNoUpdateLocked(

                    now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);



            // 仅在启动完成后播放充电声音,因此充电声音不会与潜在的通知声音一起播放

            // mBootCompleted此值在启动完成后会置为true

            if (mBootCompleted) {

                if (mIsPowered && !BatteryManager.isPlugWired(oldPlugType)

                        && BatteryManager.isPlugWired(mPlugType)) {

                    mNotifier.onWiredChargingStarted(mUserId);

                } else if (dockedOnWirelessCharger) {

                    //通知无线充电状态

                    mNotifier.onWirelessChargingStarted(mBatteryLevel, mUserId);

                }

            }

        }

        mBatterySaverStateMachine.setBatteryStatus(mIsPowered, mBatteryLevel, mBatteryLevelLow);

    }

}

此方法会在多种情况下调用,接收电池改变广播,以及其他一些情况

最终如果dockedOnWirelessCharger值为true的话,会向下通知无线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值