2 Stimmen

Meine App entlädt den Akku, auch wenn ich den Wake-Lock freigebe

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

1voto

acj Punkte 4770

Wenn Ihr Dienst mehrere Absichten empfängt, erstellt Ihr Code jedes Mal, wenn onStartCommand ausgeführt wird, einen neuen WakeLock. Sie würden nur den letzten WakeLock freigeben und die anderen undichten lassen, was den Batterieverbrauch erklären würde. Logcat liefert normalerweise hilfreiche Nachrichten in dieser Situation.

Da Ihr Dienst für eine bestimmte Zeit aktiv bleibt, könnten Sie überprüfen, ob mWakeLock initialisiert ist, bevor Sie newWakeLock() aufrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X