ブロードキャストレシーバーがintent.action_battery_changedに応答する前にバッテリーレベルを取得します

StackOverflow https://stackoverflow.com/questions/3661464

質問

私のプログラムには、バッテリーレベルに反応するためのブロードキャストレシーバーがあります。

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の例外を取得したばかりで、アプリがクラッシュしました!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top