2012-08-15 32 views
6

Trong ứng dụng của tôi, tôi muốn làm điều gì đó khi pin yếu. Khi pin là ngọn lửa android thấp ACTION_BATTERY_LOW và khi pin lại đạt đến sức khỏe tốt, nó sẽ bắn ý định ACTION_BATTERY_OKAY. Vì vậy, tôi có ba câu hỏi liên quan đến điều này:Khi Android kích hoạt ACTION_BATTERY_LOW

1.Tỷ lệ phần trăm pin android thực sự kích hoạt ACTION_BATTERY_LOW là gì?

2.Không cháy cùng một sự kiện liên tục nếu pin thậm chí còn thấp hơn?

3.Chúng tôi có thể định cấu hình phần trăm pin mà Android sẽ bắn mục đích ACTION_BATTERY_LOW không?

Tôi quan tâm nhiều hơn đến điểm thứ ba.

Trả lời

8

Không, bạn không thể đặt thời điểm ngưỡng ACTION_BATTERY_LOW sẽ được gửi. Đó là ý định mức hệ thống được chỉ định bởi ROM Android. Đây là mã nơi nó đặt giá trị trong Dịch vụ Pin:

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

Xem mã dưới đây được cắt từ mã hệ điều hành Android trong phương pháp cập nhật các dịch vụ Pin:

/* 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); 
3

Mục đích đó được kích hoạt từ BatteryService. Bạn sẽ phải phân tích mã một chút, nhưng tôi khá chắc chắn rằng nó không cháy liên tục:

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

Giá trị thực tế mà nó kích hoạt được thiết lập trong tài nguyên android, vì vậy nó chỉ có thể định cấu hình trong khi xây dựng hệ thống. Đây là những gì chúng tôi đã cho phần cứng của chúng tôi, nhưng điều này có thể sẽ khác nhau cho mỗi nền tảng phần cứng Android chạy trên:

<!-- 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> 

Trừ khi bạn đang phát triển một nền tảng phần cứng tùy chỉnh, tôi sẽ không thực hiện bất kỳ giả định về những gì các giá trị này được đặt thành.

+0

Chỉ cần một mã hóa câu hỏi tiêu chuẩn, nơi nào bạn lưu trữ các số nguyên của bạn? Là nó trong một tập tin hằng số riêng biệt? –

+0

Đã một thời gian kể từ khi tôi xem xét điều đó, nhưng tôi khá chắc chắn những điều đó đã được xác định trong tài nguyên Dịch vụ pin. Chúng tôi chỉ cần điều chỉnh chúng. – jsmith

+1

@KalaJ nếu các số nguyên này sẽ được sử dụng * chỉ * trong các tệp java sau đó lưu trữ nó, 'CONST.java' (cho hằng số) hoặc' CONFIG.java' (cho tham số cấu hình). Nếu chúng dành cho giao diện người dùng, thì bạn lưu trữ nó 'values.xml'. Lưu ý: 'values.xml' giống như bất kỳ tệp res khác và bạn có thể có nhiều phiên bản dựa trên nội địa hóa, v.v. –

Các vấn đề liên quan