android 跳出函数,Android电量计重要的类及函数介绍

几段重要代码

回调获取电池属性,发送广播:

系统底层监测到电量变化,将回调如下函数:

platform/frameworks/base/services/java/com/android/server/BatteryService.java

BatteryListener

private final class BatteryListener extends IBatteryPropertiesListener.Stub {

public void batteryPropertiesChanged(BatteryProperties props) {

BatteryService.this.update(props);

}

}

---->update();

---> processValuesLocked()

----->sendIntentLocked()

系统电量变化,最终调用如下函数:

sendIntentLocked

private void sendIntentLocked() {

// Pack up the values and broadcast them to everyone

final Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); //new一个ACTION_BATTERY_CHANGED广播

intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY

| Intent.FLAG_RECEIVER_REPLACE_PENDING);

int icon = getIconLocked(mBatteryProps.batteryLevel);

intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryProps.batteryStatus);

intent.putExtra(BatteryManager.EXTRA_HEALTH, mBatteryProps.batteryHealth);

intent.putExtra(BatteryManager.EXTRA_PRESENT, mBatteryProps.batteryPresent);

intent.putExtra(BatteryManager.EXTRA_LEVEL, mBatteryProps.batteryLevel);

intent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_SCALE);

intent.putExtra(BatteryManager.EXTRA_ICON_SMALL, icon);

intent.putExtra(BatteryManager.EXTRA_PLUGGED, mPlugType);

intent.putExtra(BatteryManager.EXTRA_VOLTAGE, mBatteryProps.batteryVoltage);

intent.putExtra(BatteryManager.EXTRA_TEMPERATURE, mBatteryProps.batteryTemperature);

intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryProps.batteryTechnology);

intent.putExtra(BatteryManager.EXTRA_INVALID_CHARGER, mInvalidCharger); //传递系统电池属性

mHandler.post(new Runnable() {

@Override

public void run() {

ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); //发送ACTION_BATTERY_CHANGED广播

}

});

}

低电量提醒界面:platform\frameworks\base\packages\SystemUI\src\com\android\systemui\power\PowerUI.java

BatteryService.java中的sendIntentLocked() 发送的ACTION_BATTERY_CHANGED,由如下类接收:

PowerUI extends SystemUI

public class PowerUI extends SystemUI {

public void start() {

IntentFilter filter = new IntentFilter();

filter.addAction(Intent.ACTION_BATTERY_CHANGED); //接收ACTION_BATTERY_CHANGED广播

filter.addAction(Intent.ACTION_SCREEN_OFF);

filter.addAction(Intent.ACTION_SCREEN_ON);

mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); //启动名为mIntentReceiver 的receiver,接收ACTION_BATTERY_CHANGED广播

}

private int findBatteryLevelBucket(int level) { //电量不同,返回的值不一样

if (level >= mLowBatteryAlertCloseLevel) {

return 1; //电量正常

}

if (level >= mContext.getResources().getInteger(

com.android.internal.R.integer.config_lowBatteryWarningLevel)) {

return 0; //电量介于低电平和正常之间,一般为电量刚刚从低于15%充电到高于15%时,返回此值

}

if (level < mContext.getResources().getInteger(

com.android.internal.R.integer.config_criticalBatteryWarningLevel)) { //该值在config.xml中定义

return -2; //电量低于15时

}

if (level < mContext.getResources().getInteger(

com.android.internal.R.integer.config_lowBatteryWarningLevel)) { //该值在config.xml中定义

return -1; //电量低于5时

}

throw new RuntimeException("not possible!");

}

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { //mIntentReceiver

public void onReceive(Context context, Intent intent) {

if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { //收到ACTION_BATTERY_CHANGED广播时

final int oldBatteryLevel = mBatteryLevel; //存储上次电量值

mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100); //mBatteryLevel获取intent传来的最新电量值

int oldBucket = findBatteryLevelBucket(oldBatteryLevel);

int bucket = findBatteryLevelBucket(mBatteryLevel);

if (!plugged //plugged为0,表示电源为完全采用电池

&& (bucket < oldBucket || oldPlugged) //当电量级别改变时或者电源由电池充电状态变为纯电池供电状态时,为真

&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN //电池状态不为未知

&& bucket < 0) { //代表电池电量低于15%时

showLowBatteryWarning(); //显示低电量界面

// only play SFX when the dialog comes up or the bucket changes

if (bucket != oldBucket || oldPlugged) {

playLowBatterySound(); //播放低电量声音文件

}

}

}

void showLowBatteryWarning() {

} //低电量界面显示,当前为空,后再详述

}

}

电量警告临界值设置:platform/frameworks/base/core/res/res/values/config.xml

电池电量参数

5

//电池电量为5时,提示一次,低电量界面

680

15

//电池电量为15时,提示一次,低电量界面

20

//电量为20,电池电量报警临界值

解决方案

解决的问题:

电量介于5%~15%时,系统只跳出一次电量低提示框,当电量低于5%时,应再跳出一次电量低提示框。

解决:

经过调试,发现问题出现在

PowerUI.java文件中的

private int findBatteryLevelBucket(int level)()函数;

传入电量后,无法正确返回,目前已经重写该函数,结果如上。

参考文档:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值