我的程序中有一个广播接收器,可以对电池级别进行反应:

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent intent) {
        int level = intent.getIntExtra("level", 0);
        // do something...
    }
}

    registerReceiver(this.mBatInfoReceiver, 
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

但是,此代码必须等待更新电池状态,因此,如果需要根据电池电量设置的GUI元素,则必须等待电池事件发生。有没有办法将其推向工作或简单地运行一些代码以查看最后一个广播中的电池级别?

有帮助吗?

解决方案

有没有办法将其推向工作或简单地运行一些代码以查看最后一个广播中的电池级别?

你可以打电话 registerReceiver() 跟你的 IntentFilternull BroadcastReceiver 要获得最后的广播 Intent. 。这是因为 ACTION_BATTERY_CHANGED 是一个所谓的“粘性广播”,我在 这个堆叠的问答.

其他提示

这就是如何在不注册接收器的情况下获得电池电量的方法:

Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
double scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
double level = -1;
if (rawlevel >= 0 && scale > 0) {
    level = rawlevel / scale;
}

由于广播的粘性性质,它可以使用无效的广播媒介。

它使用getApplicationContext()技巧,以防您处于意图接收器中并获得例外:

android.content.receivercallnotlowlallowedException:不允许注册IntentReceiver组件以接收意图

    public static String batteryLevel(Context context)
    {
        Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));   
        int    level   = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int    scale   = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int    percent = (level*100)/scale;
        return String.valueOf(percent) + "%";
    }
// Put this Code into your MainActivity

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent i) {
        int level = i.getIntExtra("level", 0);
        ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
        pb.setProgress(level);
        TextView tv = (TextView) findViewById(R.id.textfield);
        tv.setText("Battery Level: " + Integer.toString(level) + "%");
    }

};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    registerReceiver(mBatInfoReceiver, new IntentFilter(
            Intent.ACTION_BATTERY_CHANGED));
}

我使用此方法在不收到更新的情况下获得电池级别。

public float getMyBatteryLevel() {
        Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        return batteryIntent.getIntExtra("level", -1);
}

请注意,您从registerReceiver电话中获得的意图

Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

可以是零的。因此,请在使用意图之前进行检查,例如

if(intent != null){ 
// do your stuff here... 
}

我刚刚有一个无效的指针例外,导致该应用程序崩溃!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top