2013-04-01 5 views
30

Ich habe im Internet gesucht und konnte die Antwort auf meine Frage nicht finden. Mein Problem ist es, die Akku-Level-Information nur einmal zu bekommen, z. Aufruf der Funktion getBatteryLevel(). Es gibt nur Lösungen, die unter Verwendung BroadcastReceiver implementiert werden, aber wie ich weiß, wird es jedes Mal auf Battery Level Change-Ereignis aufgerufen werden. Bitte, sag mir, wie kann ich diese Information nur einmal bekommen?Holen Sie den Akkustand nur einmal mit Android SDK

+4

Verwenden Sie einen 'BroadcastReceiver' und dann, sobald Sie den Wert einmal nur unregiester den Empfänger. – TronicZomB

Antwort

96

Die Intent.ACTION_BATTERY_CHANGED Sendung ist eine sogenannte "Sticky Broadcast". Da dies klebrig ist, können Sie sich für die Übertragung mit einem Null-Empfänger registrieren, der nur die Batterieladung eine Zeit erhält, wenn Sie registerReceiver anrufen.

Eine Funktion den Ladezustand der Batterie zu erhalten, ohne Updates zu erhalten etwas wie dies aussehen würde:

können
public float getBatteryLevel() { 
    Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 

    // Error checking that probably isn't needed but I added just in case. 
    if(level == -1 || scale == -1) { 
     return 50.0f; 
    } 

    return ((float)level/(float)scale) * 100.0f; 
} 

Weitere Daten aus dieser Dauerhaften Broadcast gezogen werden. Mit dem zurückgegebenen batteryIntent können Sie auf weitere Extras zugreifen, wie in der Klasse BatteryManager beschrieben.

+0

Diese Methode kann jetzt nicht von einem Empfänger (z. B. einem Widget) aus aufgerufen werden. Kennen Sie eine andere Möglichkeit, den Akkustatus zu ermitteln, der in der onUpdate() -Methode eines Widgets ausgeführt werden kann? –

+1

Wenn Sie dies über ein Widget tun, müssen Sie 'registerReceiver' so aufrufen: 'getApplicationContext(). RegisterReciever (...)' damit es funktioniert. – MCeley

+0

Ich habe einen Kontext und kann es anrufen, aber der Anruf ist nicht innerhalb eines Empfängers erlaubt, diese oder Null als der erste Parameter "Empfänger" übergeben. Log-Nachricht ist sehr explizit, dass Sie nicht von einem Empfänger aus anrufen können. –

Verwandte Themen