3

私の目標は:関数を呼び出すときに、正確な現在のバッテリー状態(レベル、電圧など)を取得したいです。

最初に、ウェブサイトに示されているように、アプリケーションでそれを実行しようとしました。次に、実際にACTION_BATTERY_CHANGEDブロードキャストがスティッキーであることを発見しました。これは、正確な現在の値ではなく、最後のブロードキャストから得たものであることを意味します。

実際、私はアンドロイドのソースコードを調べました。バッテリーインターフェースの場合、ドライバーには、現在のsoc(充電状態)、電圧などを含むバッテリー内のレジスタを読み取る機能があります.

システムがスティッキー ブロードキャスト ACTION_BATTERY_CHANGED をいつどのように送信するのか疑問に思っています。定期的に送信しますか (たとえば、10 秒ごとにバッテリ内のレジスタを読み取り、ブロードキャストを送信します)? それとも、他の基準に基づいて送信しますか (たとえば、soc の変更、電圧?しかし、電圧は mV に関して非常に頻繁に変更されます)?

私の目標を実現するための面倒な方法の 1 つは、ドライバー関数を呼び出すシステム コールを実装し、NDK を再コンパイルしてアプリケーション コードで使用できるようにすることです。しかし、上記のことを考慮して、 ACTION_BATTERY_CHANGED ブロードキャストを介して直接これを実行できるかどうかを知りたいだけですか? ブロードキャストを再登録しても影響はありますか?

4

3 に答える 3

2

ブロードキャスト レシーバーをバッテリー レベルに登録するだけです。onReceive でバッテリー レベルの結果を取得します。

private void batteryLevel() {
         BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
                   public void onReceive(Context context, Intent intent) {
                                context.unregisterReceiver(this);
                                int rawlevel = intent.getIntExtra("level", -1);
                                int scale = intent.getIntExtra("scale", -1);
                                int level = -1;
                                if (rawlevel >= 0 && scale > 0) {
                                                   level = (rawlevel * 100) / scale;
                                }
         batterLevel.setText("Battery Level Remaining: " + level + "%");
     }
    };
IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}

これがあなたを助けることを願っています。

于 2013-06-13T05:09:44.757 に答える