ブロードキャストレシーバーがintent.action_battery_changedに応答する前にバッテリーレベルを取得します
-
01-10-2019 - |
質問
私のプログラムには、バッテリーレベルに反応するためのブロードキャストレシーバーがあります。
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()
あなたと IntentFilter
そしてa null
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;
}
ブロードキャストの粘着性の性質のために、null broadcastreceiverを使用できます。
Intent Receiverに入って例外を取得した場合に備えて、getApplicationContext()トリックを使用します。
android.content.receivercallnotallowedexception: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 Callから得られる意図に注意してください
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
nullにすることができます。意図を使用する前にチェックしてください。
if(intent != null){
// do your stuff here...
}
Null Pointerの例外を取得したばかりで、アプリがクラッシュしました!