有种场景,只想收听一次广播,例如,在关机时,获取一下电量,若电量超过20%,才进行升级的处理。
【实现方式一】采用传统的收听广播的方式,势必要写个onReceive()方法,并在其中更新当前电量的值,但由于只是想
关机时使用一次,其余时候收的广播都是浪费。所以,这样不好。
【实现方式二】不收听广播,还可以调用getBatteryLevel的接口,但由于BatteryService的父类是Binder,没有实现客户端,不能直接获取到其实例,
无法直接使用其中的方法,可以考虑通过在PowerManagerService中增加个接口,由于PMS可以直接访问BatteryService,
这样是可以达到目的,但需要修改PMS,不好。
【实现方式三】直接读取保存电量的文件,获取电量值,直接通过InputStreamReader类,如:
char[] buffer = new char[10];
inputStreamReader inputStreamReader = new inputStreamReader(new FileInputStream(new File(POWER_FILE_PATH)));
inputStreamReader.read(buffer, 0, buffer.length);
try{
batteryLevel = Integer.parseInt(new String(buffer, 0, count));
} catch(NumberFormatException e) {
Log.e(TAG, e.toString());
}
return 0;
其中,电池电量文件的路径:/sys/class/power_supply/battery/capacity/...
这种方式也不好,绕开java层电量的处理,直接读取底层的文件,耦合性强,如果底层文件路径等变化,又要修改。
那么,有没有一种更好的方式呢?
【实现方式四】发现,BatteryService发送的电池信息的广播是sticky的,可以用以下方法读取sticky广播的内容:
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
if (intent != NULL) {
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
}
通过这种方式,可以达到目的,即注册一次广播,不增加任何接口,但这种方式只适用于sticky的广播。