[OFFEN] Standby/Screenoff bei bestimmten Funktionen verhindern

H

hs1

Fortgeschrittenes Mitglied
8
Hallo Leute,

ich habe die Anforderung bekommen, dass meine App während bestimmte Funktionen laufen (z. B. der Benutzer drückt auf einen Button und es werden Daten vom Server abgerufen) der Screen immer an bleiben soll (setKeepScreenOn(true)). Nachdem die jew. Funktion durchgelaufen ist, soll der Dauer-Screen-On-Modus wieder deaktiviert werden (setKeepScreenOn(false)), so dass der Bildschirm entsprechend der im System eingestellten Zeit irgendwann wieder ausgeht.

Meine Anwendung (läuft auf 2.3-Geräten) besteht aus einer einzigen Activity die ein FrameLayout enthält in das die Fragmente immer eingesetzt werden.

Ich habe verschiedene Ansätze versucht die leider alle nicht funktionierten, weshalb ich mich jetzt an Euch wende:

Im Manifest ist folgendes gesetzt:
<uses-permission android:name="android.permission.WAKE_LOCK" />

Versuch 1:
Code:
    public void setKeepScreenOn(boolean pOn){
        View view = getLayoutInflater().inflate(R.layout.activity_main, null);
        view.setKeepScreenOn(pOn);
    }


-> Der Aufruf der Funktion setKeepScreenOn hat überhaupt keine Auswirkung


Versuch 2:

Code:
   private PowerManager mPowerManager;
   private PowerManager.WakeLock mWakeLock;

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | 
PowerManager.ACQUIRE_CAUSES_WAKEUP, "no sleep");

      .......................}


    public void setKeepScreenOn(boolean pOn){
        try {
            if (pOn){
                mWakeLock.acquire();
            }
            else{
                if (mWakeLock.isHeld()){
                    mWakeLock.release();
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

-> Der Aufruf der Funktion setKeepScreenOn hat überhaupt keine Auswirkung. mWakeLock.isHeld() ist false, obwohl das WakeLock zwischendurch nicht released wird.



Versuch 3:
Code:
    public void setKeepScreenOn(boolean pOn){
        if (pOn){
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        else{
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    }

-> Der Aufruf der Funktion setKeepScreenOn hat überhaupt keine Auswirkung. Wenn ich die Funktion setKeepScreenOn(true) testweise im onCreate aufrufe bleibt der Bildschirm immer an, auch wenn später wieder setKeepScreenOn(false) aufgerufen wird.


Habt Ihr eine Idee wie ich die Problematik lösen kann?

Gruß hs1

 
Warum klappt Versuch 3 nicht?! Kannst du den Aufruf im Quellcode zeigen?!

Versuch 2 ist nicht notwendig und Versuch 1: Das Flag sollte nicht im Code sondern im XML schon gesetzt sein.
 
Jop, in der MainActivity aus der auch die Funktion aufgerufen wird bei der das Standby temporär deaktiviert werden soll:

Code:
private void starteSync(){
    this.setKeepScreenOn(true);

    .......
 
    SyncProcessAsync proc = new SyncProcessAsync(this);
    proc.addSyncCompletedEventListener(this);
    proc.execute(params);
}


@Override
public void SyncDone(FunctionResult pResult) {
    this.setKeepScreenOn(false);
}


public void setKeepScreenOn(boolean pOn){
        if (pOn){
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        else{
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
}

SyncDone wird aufgerufen, nachdem der asynchrone Aufruf fertig ist (addSyncCompletedEventListener).
 
Klappt das:

Code:
private void starteSync(){
  
runOnUiThread (new Runnable() {
        public void run() {
            this.setKeepScreenOn(true);
        }
    });
   .......
}

   .......

@Override
public void SyncDone(FunctionResult pResult) {
     runOnUiThread (new Runnable() {
        public void run() {
            this.setKeepScreenOn(false);
        }
    });
}
 
Funktioniert nicht. Kann es was damit zu tun haben, dass ich alle Eingabemasken/Anzeigen bei mir Fragmente sind?
 
Du hast es so gemacht wie im Training von offizieller Seite auch beschrieben ist. Du hast die Flags gesetzt so wie es sein soll. Ich bin mit meinem Latein da leider auch am Ende.

Es sollte eigentlich dein Bildschirm anlassen solange die Activity nicht in den Hintergrund gedrängt wird.

Wenn du den ganzen Quelltext der Activity mal zeigen könntest würde da evtl etwas ins Auge springen.
 
Zuletzt bearbeitet:
An den Fragmenten kann es nicht liegen. Die hängen an der Activity.

Wird die Methode SyncDone(FunctionResult pResult) überhaupt aufgerufen? (Unter Java werden Methoden eigentlich klein geschrieben, und das Verb steht an erster Stelle. zB. doneSync(). Das erhöht die Lesbarkeit.)

Laut der Doku ist der 3. Weg der richtige.
Keeping the Device Awake | Android Developers
 

Ähnliche Themen

S
Antworten
9
Aufrufe
1.208
swa00
swa00
D
Antworten
17
Aufrufe
408
datNeMo
D
M
Antworten
3
Aufrufe
167
moin
M
Zurück
Oben Unten