电池

Browse sample. 浏览示例

本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) IBattery 接口检查设备的电池信息并监控变化。 此接口还提供有关设备的节能模式状态的信息,指示设备是否在低功耗模式下运行。

IBattery 接口的默认实现通过 Battery.Default 属性提供。 IBattery 接口和 Battery 类都包含在 Microsoft.Maui.Devices 命名空间中。

开始使用

要访问“电池”功能,需要以下特定于平台的设置。

需要具有 BatteryStats 权限,并且必须在 Android 项目中进行配置。 可通过以下方式配置权限:

  • 添加基于程序集的权限:

    打开 Platforms/Android/MainApplication.cs 文件,并在 using 指令后添加以下程序集特性:

    [assembly: UsesPermission(Android.Manifest.Permission.BatteryStats)]
    

    - 或 -

  • 更新 Android 清单:

    打开 Platforms/Android/AndroidManifest.xml 文件,并在 manifest 节点中添加以下行:

    <uses-permission android:name="android.permission.BATTERY_STATS" />
    

    - 或 -

  • 在清单编辑器中更新 Android 清单:

    在 Visual Studio 中,双击 Platforms/Android/AndroidManifest.xml 文件以打开 Android 清单编辑器。 然后,在“所需权限”下选中“BATTERY_STATS”权限。 这样会自动更新 AndroidManifest.xml 文件。

检查电池状态

可以访问 Battery.Default 属性来检查电池状态,这是 IBattery 接口的默认实现。 此接口定义各种属性,以提供有关电池状态的信息,例如用于读取电池剩余电量的 ChargeLevelChargeLevel 属性可返回一个介于 0.01.0 之间的值,指示电池的充电量从空到满的状态。

BatteryInfoChanged 事件也可用,会在电池状态改变时引发。 以下示例演示了如何使用和监控 BatteryInfoChanged 事件并将电池状态报告给 Label 控件:

private void BatterySwitch_Toggled(object sender, ToggledEventArgs e) =>
    WatchBattery();

private bool _isBatteryWatched;

private void WatchBattery()
{
    
    if (!_isBatteryWatched)
    {
        Battery.Default.BatteryInfoChanged += Battery_BatteryInfoChanged;
    }
    else
    {
        Battery.Default.BatteryInfoChanged -= Battery_BatteryInfoChanged;
    }

    _isBatteryWatched = !_isBatteryWatched;
}

private void Battery_BatteryInfoChanged(object sender, BatteryInfoChangedEventArgs e)
{
    BatteryStateLabel.Text = e.State switch
    {
        BatteryState.Charging => "Battery is currently charging",
        BatteryState.Discharging => "Charger is not connected and the battery is discharging",
        BatteryState.Full => "Battery is full",
        BatteryState.NotCharging => "The battery isn't charging.",
        BatteryState.NotPresent => "Battery is not available.",
        BatteryState.Unknown => "Battery is unknown",
        _ => "Battery is unknown"
    };
    
    BatteryLevelLabel.Text = $"Battery is {e.ChargeLevel * 100}% charged.";
}

低功耗节能模式

使用电池运行的设备可以置于低功耗节能模式。 有时,设备会自动切换到此模式,例如,当电池电量降到 20% 以下时。 操作系统通过减少往往会消耗电池的活动来响应节能模式。 打开节能模式时,应用程序有助于避免后台处理或其他高功率活动。

重要

如果设备的节能模式状态已打开,则应用程序应避免后台处理。

可以通过访问 EnergySaverStatus 属性(OnOffUnknown)读取设备的节能状态。 如果状态为 On,则应用程序应避免执行后台处理或可能会消耗大量电力的其他活动。

当电池进入或退出节能模式时,电池将引发 EnergySaverStatusChanged 事件。 还可以使用 EnergySaverStatus 属性获取设备的当前节能状态:

下面的代码示例可监控节能状态并相应地设置属性。

private bool _isBatteryLow = false;

private void BatterySaverSwitch_Toggled(object sender, ToggledEventArgs e)
{
    // Capture the initial state of the battery
    _isBatteryLow = Battery.Default.EnergySaverStatus == EnergySaverStatus.On;
    BatterySaverLabel.Text = _isBatteryLow.ToString();

    // Watch for any changes to the battery saver mode
    Battery.Default.EnergySaverStatusChanged += Battery_EnergySaverStatusChanged;
}

private void Battery_EnergySaverStatusChanged(object sender, EnergySaverStatusChangedEventArgs e)
{
    // Update the variable based on the state
    _isBatteryLow = Battery.Default.EnergySaverStatus == EnergySaverStatus.On;
    BatterySaverLabel.Text = _isBatteryLow.ToString();
}

电源

PowerSource 属性可返回 BatteryPowerSource 枚举,指示设备的充电方式(如果正在充电)。 如果未充电,则状态为 BatteryPowerSource.BatteryBatteryPowerSource.ACBatteryPowerSource.UsbBatteryPowerSource.Wireless 值指示电池正在充电。

下面的代码示例可基于电源设置 Label 控件的文本。

private void SetChargeModeLabel()
{
    BatteryPowerSourceLabel.Text = Battery.Default.PowerSource switch
    {
        BatteryPowerSource.Wireless => "Wireless charging",
        BatteryPowerSource.Usb => "USB cable charging",
        BatteryPowerSource.AC => "Device is plugged in to a power source",
        BatteryPowerSource.Battery => "Device isn't charging",
        _ => "Unknown"
    };
}

平台差异

本部分介绍特定于平台的电池差异。

无平台差异。