服务中的ACTION_BATTERY_CHANGED意图

3

我正在使用这段代码在我的服务中跟踪电池信息:

    Intent i = new ContextWrapper(applicationContext).registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
     // now you can get the level and scale from this intent variable
    int level = i.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = i.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float battPct = level/(float)scale;

1. 我想知道更换电池后会自动更改吗?还是我需要定期自己触发该意图? 2. 另外,我想知道是否有一种方法可以计算自剩余电量为1%以来已经过去了多长时间。

2个回答

10

更好的获取变化值的方法是使用BroadcastReceiver

当电池发生变化时,您需要使用BroadCastReceiver来获取已更改的值。

IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryLevelReceiver, batteryLevelFilter);

BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent){
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        float battPct = level/(float)scale;       
    }
};

可以在Service中实现吗?因为我之前尝试过,但甚至没有执行我在Broadcast接收器中插入的日志。如果您能提供一些示例,我将不胜感激。 - whiteLT
@whiteLT 如果日志不起作用,您可以使用调试。至于您的第二个问题,您需要编写代码并保存自1%以来经过的时间值。 - Ajay S
是的,你知道如何实现“时间流逝计算器”吗?我需要在开始时标记一个时间,然后在ACTION_BATTERY_CHANGED之后再次标记吗?而且你真的知道这个BroadcastReceiver会在Service中工作吗?它在我的Activity中工作(显示日志等)。 - whiteLT
也许您知道如何将信息从OnReceive服务传递到我的活动中吗?因为如果我尝试在OnReceive之外使用信息,我会得到0。例如: public void onReceive(Context context, Intent intent){ ..... int level = i.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); a=level; } 当我尝试在OnReceive之外访问a时,我总是得到0,为什么无法在OnReceive方法之外访问它? - whiteLT

0

以下方法对我有效:

在清单文件中,找到**<activity android:name=".MainActivity">** 并替换为***<activity android:name=".MainActivity" android:exported="true">***


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接