2016-05-18 24 views
0

Ich habe eine Anwendung, die ich, dass automatisch verwenden sperrt (erfordert einen Bildschirm Passworteingabe) ...Hinzufügen eines PASSWORD-Bildschirms zu einer App, die erneut gesperrt wird, wenn das Gerät schläft?

a) when the app starts for the first time 
b) when another app is started and takes over the device 
c) when the device "sleeps" automatically 
d) when the user "sleeps" the device manually 
(note: with c & d, if the user "awakens" the app within 5 seconds, it does NOT ask for the password) 

Ich möchte dies für eine App tun, die ich auch schreibe, damit ich eine Aktivität erstellt (PasswordActivity) mit den notwendigen Verifikationsschritten und lassen es richtig funktionieren.

Ich legte es ursprünglich in die ONCREATE der (das wurde in der AndroidManifest gestartet). Das schien gut zu funktionieren. Aber dann begann die Re-Lock-Fähigkeit. Also versucht, es auf die ONSTART oder ONRESUME zu verschieben. Aber als dann eine andere AKTIVITÄT in meiner APP den Fokus nahm, oder der Bildschirm rotierte, dann feuerte der PasswordActivity erneut. Das wird nicht funktionieren.

Hier habe ich einen Thread gefunden, der es empfiehlt, die LAUNCHER App im Manifest zu machen und dann, wenn das Passwort OK ist, die MainActivity aufzurufen. Das schien besser zu funktionieren ... aber dann kam es zu einem Problem, dass es nur dann wieder gesperrt wird, wenn der Benutzer den Zurück-Button vom Hauptbildschirm aus gedrückt hat (ich nehme an, ich stoppe meine App) und startet die App erneut. Fängt jedoch keine andere APP ein, die das Gerät übernimmt.

Also basierend darauf, und nachdem ich die gesamte Dokumentation gelesen habe, kann ich Lebenszyklen finden (obwohl die meisten davon ACTIVITY-basiert sind, nicht APPLICATION) nicht sicher, wie man fängt, wenn die APP selbst den Fokus verliert (eine andere App übernimmt) und wie man den automatischen oder manuellen Schlaf (C & D oben) zusammen mit der Zeitverzögerungsüberprüfung handhabt. Ich gehe davon aus, dass es sich um eine Kombination von mehreren Anrufen oder Schritten handelt, aber nicht genau, welche an dieser Stelle.

Irgendwelche Empfehlungen?

+0

Ich denke, wenn Ihre App auf Hintergrund geht (verliert Fokus) wird die Funktion 'onPause' ausgeführt. Das ist was du verlangst? – UDKOX

+0

'OnPause' von dem, was ich sagen kann (und online gelesen haben in Bezug auf LIFECYCLES Brände, wenn eine Aktivität Fokus verliert ... nicht unbedingt die APP selbst. Wenn ich versuche, es in' onPause' zu ​​fangen passiert es, wenn eine andere Aktivität INNERHALB meiner App wird auch fokussiert. Das geht nicht. – Peter

+0

Kannst du nicht einfach überprüfen, ob eine andere Aktivität den Fokus hat? Etwas wie: 'public void onPause() {if (! hasAnotherActivityFocus()) {lockPassword();}}' – UDKOX

Antwort

0

Ich denke, ich habe es mit einigen der Vorschläge sowie einige Nachforschungen herausgefunden. Ich poste hier meine Lösung für den Fall, dass es jemand anderem helfen kann, jemand sieht einen bestimmten Fehler, den ich noch nicht gesehen oder gesehen habe, oder jemand hat einen anderen Input, der ihn verbessern könnte.

Wie erwähnt, ist das größte Problem, wie ich feststellen kann, ist es keine integrierten Funktionsaufrufe, die bestimmen können, wenn "Ihre App" nicht im Vordergrund ist. Die und onResume sind aktivitätsbasiert, nicht appbasiert ... also wird in Ihrer App von Aktivität zu Aktivität und sogar Bildschirmrotation gewechselt.

Um dies zu umgehen ... Ich habe eine globale Variable namens gv.appPauseTime erstellt. Ich habe zwei separate universelle Utility-Funktionen erstellt, die ich von überall in meiner App aus aufrufen kann.

public static void lockAppStoreTime() { 
    gv.appPauseTime=new Date(); 
} 

public static void lockAppCheck(Activity act) { 
    boolean bLock=false; 

    // Check to see if this is the first time through app  
    if (gv.appPauseTime==null) { 
     bLock = true; 
    } else { 
     Date currTime = new Date(); 
     long diffMillis = currTime.getTime() - gv.appPauseTime.getTime(); 
     long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffMillis); 

     // Lock app if 120 seconds (2 minutes) has lapsed 
     if (diffInSec > 120) { 
      bLock=true; 
     } 
    } 

    gv.appLastPause = new Date(); 
    if (bLock) { 
     Intent j = new Intent(act, PasswordActivity.class); 
     act.startActivity(j); 
    } 
} 

In jeder Aktivität legen I (oder geändert), um die und onResume wie so ...

@Override 
public void onPause(){ 
    super.onPause(); 
    Util.lockAppStoreTime(); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    Util.lockAppCheck(this); 
} 

Wenn die Feuer, es das aktuelle Datum (Uhrzeit) speichert. Wenn eine onResume in einer beliebigen Funktion ausgelöst wird, vergleicht sie das aktuelle Datum (Uhrzeit) mit dem gespeicherten Datum. Wenn 120 Sekunden (2 Minuten) verstrichen sind, wird PasswordActivity angezeigt, um das Passwort zu überprüfen. Es speichert das aktuelle Datum (die Uhrzeit), bevor es die PasswordActivity aufruft, damit es nicht wiederholt wird.

Grundsätzlich, wenn es eine Pause von 2 Minuten gibt, zwischen einer Aktivität pausiert und einer beliebigen Aktivität, IN MY APP, Fortsetzen (oder Start), fordert es zur Eingabe des Passworts. Wenn der Benutzer eine andere APP öffnet und dann wieder zu meiner APP ... zurückkehrt, wenn es mindestens 2 Minuten verstrichen ist, wird nach dem Passwort gefragt.Wenn der Benutzer die App abschaltet oder schließt, löst der Neustart auch das Passwort aus.

Ich wählte 2 Minuten, weil das scheint eine anständige "Zeitraffer" in unserer App im Allgemeinen. Natürlich kann das auch geändert werden.

So weit, so gut. Hoffe das hilft anderen.