Ich baue eine einfache App, die einen BroadcastReciever
hat, der auf den PHONE_STATE hört:
In der onReceive()
-Methode des BroadcastReciever
starte ich einen Dienst, wenn der Zustand OFFHOOK
ist, und stoppe den Dienst, wenn der Zustand IDLE
ist:
public class PhoneStateBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
context.startService(new Intent(context, ProximityService.class));
}
else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
context.stopService(new Intent(context, ProximityService.class));
}
}
}
In dem Dienst registriere ich einen Näherungssensor-Listener und erstelle einen WakeLock
, damit der Bildschirm während eines Anrufs ordnungsgemäß ausgeschaltet wird. Nachdem der Anruf beendet ist, stoppe ich den Dienst, und in seinem onDestroy()
-Methode deregistriere ich den Listener und löse den WakeLock
. Aber anscheinend wird etwas nicht freigegeben, denn ich sehe einen enormen Batterieverbrauch durch meine App (30%).
Ich habe ein Log für das Deaktivieren des Listeners und auch für das Freigeben des WakeLocks
gesetzt, und ich sehe, dass der WakeLock
freigegeben wird und der Listener erfolgreich deaktiviert ist (Ich sehe auch das Log vom SensorManager
, dass der Listener deaktiviert ist).
Was fehlt mir hier? Das ist wirklich ärgerlich.
Einiger Code des Dienstes:
public int onStartCommand(Intent intent, int flags, int startId){
Log.d("CALL", "Service started");
// Erhalten Sie eine Instanz des Sensor Services und verwenden Sie diese, um eine Instanz eines bestimmten Sensors zu erhalten.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
mAudioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
mPowerMngr = (PowerManager) getSystemService(Context.POWER_SERVICE);
try{
mWakeLock = mPowerMngr.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, "Proximity");
if (!mWakeLock.isHeld()) {
Log.d("CALL", "Wake lock acquired");
mWakeLock.acquire();
}
}
catch (Exception e){
mWakeLock = null;
}
return START_STICKY;
}
public void onDestroy(){
super.onDestroy();
mSensorManager.unregisterListener(this);
if (mWakeLock != null) {
if (mWakeLock.isHeld()) {
Log.d("CALL", "Wake lock released");
mWakeLock.release();
}
}
Log.d("CALL", "Service stopped");
}
Das Log, das ich sehe:
09-30 03:35:09.120: D/SensorManager(21565): unregisterListener:: disable all sensors for this listener, listener = com.eladaharon.android.proximity.ProximityService@41a31a18
09-30 03:35:09.125: D/CALL(21565): Wake lock released
09-30 03:35:09.125: D/CALL(21565): Service stopped
Vielen Dank! Elad