Das "Verlassen" einer Activity bereitet heftige Probleme :-/

missspelled

missspelled

App-Anbieter (In-App)
127
Gelöst

Hallo,
die Frage klingt auf den ersten Blick recht einfach - trotzdem bereitet folgende Sachlage mir schon seit Stunden Kopfzerbrechen.

Ich habe eine Art Login-Screen, der aufgerufen wird, wenn der Nutzer die App verlassen hat.

Grundsätzlich funktioniert dieser Mechanismus schon sehr gut. In onPause starte ich einen TimerTask in einer von "Application" abgeleiteten Klasse und bei onResume wird dieser TimerTask wieder angehalten.

Code:
    @Override
    protected void onResume() {

        Logic.showLoginScreenIfNeeded(this);

        super.onResume();
    }


    @Override
    protected void onPause() {

        Logic.enableLockTimerIfNeeded(this, this);

        super.onPause();
        //        if (mMaterialDialog != null) mMaterialDialog.dismiss();
    }
Problematisch wird es allerdings wenn ich die App mittels "Power Button" sperre, also praktisch den Bildschirm sperre.. Dann wird nämlich beim Entsperren für ca. eine viertel Sekunde die alte Activity geladen bevor dann mein "Login-Screen" vorgeschaltet wird.
Wenn ich die App mittels Home Button oder mittels Öffnen einer anderen App schließe und wieder öffne wird direkt der "Login-Screen" eingeblendet - so soll es auch sein...

An was liegt das? Muss ich eventuell die Übergangs-Animation für den Wiedereintritt beim Verlassen über den Power-Button überschreiben?! Ich habe null Ahnung was schief läuft.
Bin für jeden Ratschlag dankbar, mir gehen langsam die Ideen aus. :confused2:

Unwichtiges im Spoiler...

Hoffe ich habe die Problematik halbwegs verständlich beschrieben.

Die einzige Auffälligkeit, die ich aus dem Logs entnehmen kann, ist, dass es (wie zu erwarten) einen kleinen zeitlichen Unterschied zwischen den Aufrufen von onPause und onStop gibt.
Beim Verlassen mittels HomeButton kommt onPause und dann nach einer minimalen "Wartezeit" onStop, während beim Verlassen mittels PowerButton (also mittels Bildschirmsperrung) beide Methoden-Aufrufe gleichzeitig in Logcat erscheinen. Aber das hilft mir jetzt halt auch nicht wirklich weiter. Puhh.. Ich befürchte fast, dass das ein heiterer Nachmittag mit einer langen Nacht wird -.-
Die Aufrufe zur Bildschirmsperrung vor bzw. hinter das überschreibende "super" zu setzen brachte keinen Erfolg. Ebenso bringt es nichts den showLoginScreenIfNeeded Aufruf in onStart bzw. onRestart zu verlagern.
NACHTRAG:
Hehe, konnte das Problem jetzt glücklicherweise lösen. :thumbsup:

Für alle die mal ein ähnliches Problem haben...
Durch das Setzten des Flags "FLAG_SHOW_WHEN_LOCKED" ist das unerwünschte Erscheinen der "bestehenden" Activity verhindert.

Sprich: Alle Activities, die nicht nach dem Sperren bzw. Entsperren in der Übergangsanimation angezeigt werden sollen erhalten in onCreate diesen Eintrag -> getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

Beste Grüße

NACHTRAG 2:
Doch nicht gelöst...
Jetzt flackert eine Benachrichtigung auf dem Sperrbildschirm - schwer zu beschreiben. Dazu kommt noch, dass man bei meiner App die automatische Sperrung abschalten kann. Ist das der Fall, wird der Lockscreen nicht mehr angezeigt, sondern direkt die oberste Activity. Verlässt man dann diese, wird daraufhin der Lockscreen angezeigt - alles in allem keine gute Lösung. Klar, kann man jetzt dafür eine Ausnahme erstellen, sodass der Code nur ausgeführt wird, wenn die automatische Sperrung aktiv ist - aber das kann nicht Sinn der Sache sein und dieses zig-Fache hin und her bewirkt, dass eine App am Ende eher schlecht als recht funktioniert. Da habe ich mittlerweile genug gesehen um, das recht sicher sagen zu können.
Sowas ist doch absoluter Mist. Das sind diese Momente an denen ich am liebsten mein Handy nehmen und mit voller Wucht gegen die Wand donnern würde. Ich hab diese Inkonsistenz* ziemlich satt.

*gemeint ist, dass offensichtlich ein anderer Code im Hintergrund ausgeführt wird, wenn man eine Activity einmal mit dem Homebutton verlässt und einmal mit der Bildschirmsperrung. Ich weiß nicht, diese 1000 verschiedenen Unterscheidungen und Sonderregelungen bringen mich bald zu dem Punkt, dass ich irgendwann keinen Bock mehr auf Android habe, mir mein 3310 schnappe und mir am liebsten irgendeine Bambus-Bude auf Hawaii zusammenwickel. Ich empfinde es als "völligst krank" was da abgeht :scared:

Okay.. jetzt hab ich's wirklich. Lösung ist sauber und funktioniert. :D

Code:
@Override
    protected void onPause() {
        super.onPause();

        Logic.showLoginIfLockedAndNeeded(this); // <- [B]neu[/B]

        Logic.enableLockTimerIfNeeded(this, this); 

        /*if (mMaterialDialog != null) mMaterialDialog.dismiss();*/
    }
Code:
    public static void showLoginIfLockedAndNeeded(Context context) {
        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        boolean isScreenOn;
        if (Build.VERSION.SDK_INT >= 20) isScreenOn = powerManager.isInteractive();
        else isScreenOn = powerManager.isScreenOn();
        if (!isScreenOn && Logic.isDirectLockEnabled(context)) {
            context.startActivity(new Intent(context, LoginActivity.class));
        }
    }

Erklärung:
Wenn der Bildschirm aus ist wird direkt die LoginActivity geladen. Puhh, Lösung war simpler als ich erst angenommen hatte. Hehe.. Manchmal ist "einfach" eben doch besser.
 
Zuletzt bearbeitet:

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
486
jogimuc
J
S
Antworten
4
Aufrufe
995
Sempervivum
S
R
Antworten
3
Aufrufe
1.625
Ritartet
R
Zurück
Oben Unten