【问题标题】:When android fires ACTION_BATTERY_LOW当 android 触发 ACTION_BATTERY_LOW
【发布时间】:2012-08-15 13:31:16
【问题描述】:

在我的应用程序中,我想在电池电量不足时做一些事情。当电池电量不足时,android 会触发 ACTION_BATTERY_LOW,当电池再次恢复到良好状态时,它会触发 Intent ACTION_BATTERY_OKAY。所以,我对此有三个问题:

1.android 实际以多少电池百分比触发ACTION_BATTERY_LOW

2.如果电池电量更低,它会重复触发相同的事件吗?

3.我们可以配置android将触发ACTION_BATTERY_LOW意图的电池百分比吗?

我比较关心第三点。

【问题讨论】:

    标签: android android-intent broadcastreceiver


    【解决方案1】:

    不,您无法设置何时发送 ACTION_BATTERY_LOW 阈值。这是由 Android ROM 指定的系统级意图。这是在电池服务中设置值的代码:

    mLowBatteryWarningLevel = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_lowBatteryWarningLevel);
    

    看下面的代码,它是从电池服务的更新方法中的Android系统代码中截取的:

    /* The ACTION_BATTERY_LOW broadcast is sent in these situations:
             * - is just un-plugged (previously was plugged) and battery level is
             *   less than or equal to WARNING, or
             * - is not plugged and battery level falls to WARNING boundary
             *   (becomes <= mLowBatteryWarningLevel).
             */
            final boolean sendBatteryLow = !plugged
                && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
                && mBatteryLevel <= mLowBatteryWarningLevel
                && (oldPlugged || mLastBatteryLevel > mLowBatteryWarningLevel);
    
            sendIntent();
    
            // 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.
            Intent statusIntent = new Intent();
            statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
            if (mPlugType != 0 && mLastPlugType == 0) {
                statusIntent.setAction(Intent.ACTION_POWER_CONNECTED);
                mContext.sendBroadcast(statusIntent);
            }
            else if (mPlugType == 0 && mLastPlugType != 0) {
                statusIntent.setAction(Intent.ACTION_POWER_DISCONNECTED);
                mContext.sendBroadcast(statusIntent);
            }
    
            if (sendBatteryLow) {
                mSentLowBatteryBroadcast = true;
                statusIntent.setAction(Intent.ACTION_BATTERY_LOW);
                mContext.sendBroadcast(statusIntent);
    

    【讨论】:

      【解决方案2】:

      该意图是从 BatteryService 触发的。您必须稍微分析一下代码,但我很确定它不会重复触发:

      http://gitorious.org/android-eeepc/base/blobs/fda6fae156e31a287e3cfbf66e51ea1405cdf479/services/java/com/android/server/BatteryService.java
      

      它触发的实际值是在 android 资源中设置的,因此它只能在系统构建期间进行配置。这是我们的硬件,但对于运行 Android 的每个硬件平台,这可能会有所不同:

      <!-- Display low battery warning when battery level dips to this value -->
      <integer name="config_lowBatteryWarningLevel">15</integer>
      
      <!-- Close low battery warning when battery level reaches this value -->
      <integer name="config_lowBatteryCloseWarningLevel">20</integer>
      

      除非您正在开发自定义硬件平台,否则我不会对这些值的设置做出任何假设。

      【讨论】:

      • 只是一个编码标准问题,您将整数存储在哪里?是否在单独的常量文件中?
      • 我已经有一段时间没有看到它了,但我很确定那些已经在电池服务资源中定义了。我们只是简单地调整了它们。
      • @KalaJ 如果这些整数将在 java 文件中 only 使用,则将其存储为 CONST.java(用于常量)或 CONFIG.java(用于配置参数) .如果它们用于 UI,那么您将其存储为 values.xml。注意:values.xml 与任何其他 res 文件一样,您可以根据本地化等拥有多个版本。
      • @DheerajBhaskar,很棒的评论。谢谢。
      【解决方案3】:

      还有另一种方法可以从“com.android.internal.R.integer”字段中检测“config_lowBatteryWarningLevel”。

      enter code here
      
          try {
              Class clazz = Class.forName("com.android.internal.R$integer");
              Field field = clazz.getDeclaredField("config_lowBatteryWarningLevel");
              field.setAccessible(true);
              int LowBatteryLevel = _context.getResources().getInteger(field.getInt(null));
      
              Log.d("LowBattery","warninglevel " + LowBatteryLevel);
          } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
              e.printStackTrace();
      
          }
      

      【讨论】:

      • 请注意,这使用反射从明确标记为internal 的 Android 类中获取信息,因此不能保证将来会起作用!
      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多