2010-08-09 20 views
8

Sto cercando un modo per proteggere con password la mia applicazione Android all'avvio, ovvero quando si avvia/riprende un'attività appartenente al mio pacchetto apk verrà visualizzata una finestra di dialogo password.Proteggere con password il lancio dell'applicazione Android

Ho provato alcuni approcci a questo (estendendo application class e così via) ma nessuno sembra funzionare. O non vengono eseguiti sul thread dell'interfaccia utente o la finestra di dialogo non viene visualizzata in ogni occasione di avvio/ripresa.

// m

+0

La classe di applicazione è la strada da percorrere, si prega di postare cosa/come si è provato, il codice. Come potrebbe essere qualcosa di sbagliato in questo. – Pentium10

risposta

13

Quindi questa è la soluzione che ho bloccato. Nella mia classe Application, memorizzo una variabile lunga con l'ora del sistema quando l'attività è stata messa in pausa l'ultima volta.

import android.app.Application; 
public class MyApplication extends Application { 
    public long mLastPause; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mLastPause = 0; 
     Log.w("Application","Launch"); 
    } 
} 

In ogni metodo onPause aggiorno questo valore all'ora corrente.

@Override 
public void onPause() { 
    super.onPause(); 
    ((MyApplication)this.getApplication()).mLastPause = System.currentTimeMillis(); 
} 

E in ogni risultato lo confronto con l'ora corrente. Se è passata una certa quantità di tempo (attualmente 5 secondi), viene visualizzato il prompt della mia password.

@Override 
public void onResume() { 
    super.onResume(); 
    MyApplication app = ((MyApplication)act.getApplication()); 
    if (System.currentTimeMillis() - app.mLastPause > 5000) { 
     // If more than 5 seconds since last pause, prompt for password 
    } 
} 
+0

Grazie per questa soluzione, penso che manchi una cosa: il codice nella funzione 'onResume' dovrebbe essere eseguito anche nella funzione' onStart' . Ho dovuto aggiungere questa parte per evitare un caso fastidioso: il blocco non veniva visualizzato dopo la riapertura dell'app dopo un'uscita pulita. –

+1

@YoannHercouet Non sono così sicuro che sia necessario. Da quello che ho capito, il metodo onResume sarà chiamato dopo il metodo onStart all'avvio a freddo. Vedi questa illustrazione dalla documentazione di Android: https://developer.android.com/images/activity_lifecycle.png –

+1

Inoltre, invece di modificare onResume e onPause di tutte le tue attività, puoi creare una classe LockActivity con i metodi Overidden necessari e fare tutto le tue attività estendono quella classe. –

3

sottoclasse di applicazione e impostare una variabile in là se la prossima volta succede qualcosa nella vostra applicazione, si dovrebbe indurre una finestra di dialogo o meno.

In Attività, Servizio, ecc ... utilizzando il contesto che si riceve, ottenere la propria applicazione, se la var è impostata per mostrare la finestra di dialogo, dal proprio codice attività (ovvero il thread dell'interfaccia utente) visualizzare la finestra di dialogo. Probabilmente lo inserirai nel tuo codice onResume.

In onPause, impostare la variabile per visualizzarla la volta successiva. In onResume, impostalo come falso.

+0

Grazie per la risposta. Una cosa però ... Sembra che non ci siano onPause e onResume a livello di applicazione, il che significa che devo impostare la variabile in ogni attività. Ciò farà sì che la finestra di dialogo della password venga visualizzata ogni volta che viene avviata/ripresa una nuova attività. Basta impostare la variabile nella classe Application 'onCreate funzionerà solo quando l'applicazione viene avviata a freddo, che probabilmente non sarà troppo spesso. Correggimi se sbaglio :-) –

+0

Dovrai renderlo un po 'più intelligente. Avere un contatore invece di un booleano. Ogni volta che si verifica un onResume, aumentalo, ogni volta che si verifica un onPause, diminuirlo. Se è 0 quando inizia un'attività, mostra la password. – Moncader

+0

Ok, ora ho implementato la soluzione e ancora non funziona poiché ad ogni avvio/ripresa di un'attività (anche se chiamata da un'altra attività) viene visualizzata la richiesta della password. Ciò accade perché l'onPause dell'attività di chiamata viene eseguita prima dell'avvio di onResume, il che significa che la variabile sarà sempre 0 all'avvio dell'attività. onPause: ((MyApplication) this.getApplication()). MActivityCounter--; onResume: App MyApplication = ((MyApplication) act.getApplication()); if (app.mActivityCounter == 0) { // Do password check } app.mActivityCounter ++; Qualche idea? –

Problemi correlati