android - close - Come uccidere un'applicazione con tutte le sue attività?



android task manager (4)

Possibile duplicato:
Chiusura di una domanda - è disapprovato?

Voglio offrire all'utente un'opzione per uscire dall'applicazione poiché ho bisogno di cancellare alcuni dati sensibili, che sono memorizzati nelle SharedPreferences a patto che l'applicazione ne abbia bisogno.

Non appena l'utente vuole uscire, la password in SharedPreferences deve essere cancellata e, naturalmente, tutte le attività dell'applicazione devono essere chiuse (non ha senso eseguirle senza la password conosciuta - si bloccherebbero).

Come lo posso fare?

System.exit(0) e finish() abbandonano solo l'attività corrente - inutile. So che c'è un'app taskmanager. Come lo sta facendo? È in grado di uccidere l'intera applicazione ...

https://src-bin.com


Answer #1

che è memorizzato in SharesPreferences fintanto che l'applicazione ne ha bisogno.

Perché?

Non appena l'utente vuole uscire, la password in SharedPreferences deve essere cancellata e, naturalmente, tutte le attività dell'applicazione devono essere chiuse (non ha senso eseguirle senza la password conosciuta - si bloccherebbero).

Ancora meglio: non inserire la password in SharedPreferences . Trattenerlo in un membro dati statico. I dati scompariranno naturalmente quando tutte le attività nell'app verranno abbandonate (ad esempio, il pulsante INDIETRO) o altrimenti distrutte (ad es., Estratte dalla RAM per fare spazio ad altre attività qualche volta dopo che l'utente ha premuto HOME).

Se si desidera una sorta di "flush password" proattiva, basta impostare il membro dei dati statici su null e fare in modo che le attività controllino quel membro e prendano l'azione appropriata quando è null .


Answer #2

Hai ragione: chiamare finish() uscirà solo dall'attività corrente, non dall'intera applicazione. tuttavia, esiste una soluzione per questo:

Ogni volta che si avvia un'attività, avviarla utilizzando startActivityForResult(...) . Quando vuoi chiudere l'intera app, puoi fare qualcosa del genere:

setResult(RESULT_CLOSE_ALL);
finish();

Quindi definire il onActivityResult(...) ogni attività in modo che quando un'attività ritorna con il valore RESULT_CLOSE_ALL , chiama anche finish() :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Ciò causerà un effetto a cascata che chiude tutte le attività.

Inoltre, supporto Commons Commons nel suo suggerimento: memorizzare la password in una variabile in modo che venga distrutta quando l'applicazione viene chiusa.


Answer #3

Quando l'utente desidera uscire da tutte le attività aperte, deve premere un pulsante che carica la prima attività che viene eseguita all'avvio dell'app, nel mio caso "LoginActivity".

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Il codice precedente cancella tutte le attività ad eccezione di LoginActivity. LoginActivity è la prima attività che viene visualizzata quando l'utente esegue il programma. Quindi inserisci questo codice all'interno di onCreate di LoginActivity, per segnalare quando deve autodistruggersi quando viene passato il messaggio "Exit".

    if (getIntent().getBooleanExtra("EXIT", false)) {
         finish();
    }

La risposta che ottieni a questa domanda dalla piattaforma Android è: "Non fare un pulsante di uscita. Termina le attività che l'utente non desidera più e il gestore delle attività le pulirà come meglio crede".


Answer #4

Quando si utilizza il metodo finish (), non chiude completamente il processo, è ANCORA funzionante in background.

Utilizzare questo codice in Attività principale (non utilizzare in tutte le attività o attività secondarie):

@Override
public void onBackPressed() {

    android.os.Process.killProcess(android.os.Process.myPid());
    // This above line close correctly
}




kill