如何实现只收听一次sticky的广播,读取电池电量的值

        有种场景,只想收听一次广播,例如,在关机时,获取一下电量,若电量超过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的广播。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值