android开发笔记之电池低电处理( 二 )


并播放低电量声音:
private void attachLowBatterySound(Notification.Builder b) {final ContentResolver cr = mContext.getContentResolver();final int silenceAfter = Settings.Global.getInt(cr,Settings.Global.LOW_BATTERY_SOUND_TIMEOUT, 0);final long offTime = SystemClock.elapsedRealtime() - mScreenOffTime;if (silenceAfter > 0&& mScreenOffTime > 0&& offTime > silenceAfter) {Slog.i(TAG, "screen off too long (" + offTime + "ms, limit " + silenceAfter+ "ms): not waking up the user with low battery sound");return;}if (DEBUG) {Slog.d(TAG, "playing low battery sound. pick-a-doop!"); // WOMP-WOMP is deprecated}if (Settings.Global.getInt(cr, Settings.Global.POWER_SOUNDS_ENABLED, 1) == 1) {final String soundPath = Settings.Global.getString(cr,Settings.Global.LOW_BATTERY_SOUND);if (soundPath != null) {final Uri soundUri = Uri.parse("file://" + soundPath);if (soundUri != null) {b.setSound(soundUri, AUDIO_ATTRIBUTES);if (DEBUG) Slog.d(TAG, "playing sound " + soundUri);}}}}
我们一般在配置文件中设置低电量的声音文件和超时时间:
.//base///res//.xml
/system/media/audio/ui/LowBattery.oggpublic void init() {// Register for Intent broadcasts for...IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_BATTERY_CHANGED);filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);filter.addAction(Intent.ACTION_USER_SWITCHED);filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);mContext.registerReceiver(this, filter, null, mHandler);}@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {final int oldBatteryLevel = mBatteryLevel;mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100);final int oldBatteryStatus = mBatteryStatus;mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,BatteryManager.BATTERY_STATUS_UNKNOWN);final int oldPlugType = mPlugType;mPlugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 1);final int oldInvalidCharger = mInvalidCharger;mInvalidCharger = intent.getIntExtra(BatteryManager.EXTRA_INVALID_CHARGER, 0);final boolean plugged = mPlugType != 0;final boolean oldPlugged = oldPlugType != 0;int oldBucket = findBatteryLevelBucket(oldBatteryLevel);int bucket = findBatteryLevelBucket(mBatteryLevel);mWarnings.update(mBatteryLevel, bucket, mScreenOffTime);if (oldInvalidCharger == 0 && mInvalidCharger != 0) {mWarnings.showInvalidChargerWarning();return;} else if (oldInvalidCharger != 0 && mInvalidCharger == 0) {mWarnings.dismissInvalidChargerWarning();} else if (mWarnings.isInvalidChargerWarningShowing()) {return;}boolean isPowerSaver = mPowerManager.isPowerSaveMode();if (!plugged&& !isPowerSaver&& (bucket < oldBucket || oldPlugged)&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN&& bucket < 0) {// only play SFX when the dialog comes up or the bucket changesfinal boolean playSound = bucket != oldBucket || oldPlugged;mWarnings.showLowBatteryWarning(playSound);
可见,现在弹出低电量通知对话框是接受广播.ED来实现的 。