我在我的程序中有一个广播接收器来响应电池电量,如下所示:
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元素,则必须等待电池事件发生。 有没有办法推动这个工作,或只是运行一些代码,看看最后一次广播的电池水平是什么?
有没有办法推动这个工作,或只是运行一些代码,看看最后一次广播的电池水平是什么?
你可以用你的IntentFilter
和一个null
BroadcastReceiver
来调用registerReceiver()
来得到最后的广播Intent
。 这是有效的,因为ACTION_BATTERY_CHANGED
是一个所谓的“粘性广播”,我在这个StackOverflow问题和答案中多描述一下。
这是如何在没有注册接收器的情况下获得电池电量:
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; }
由于广播的粘性,它可以使用空的BroadcastReceiver。
它使用getApplicationContext()技巧,以防止您处于意图接收方并获取exception:
android.content.ReceiverCallNotAllowedException:IntentReceiver组件不允许注册接收intents
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));
可以为null。 所以请在使用意图之前进行检查,例如
if(intent != null){ // do your stuff here... }
我刚刚得到一个空指针exception,导致应用程序崩溃!
以上就是android开发分享在广播接收器响应Intent.ACTION_BATTERY_CHANGED之前获取电池电量相关内容,想了解更多android开发(异常处理)及android游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/addevelopment/513096.html