Come Creare un Pulsante di Uscita (Exit Button) in un'App Android (Sviluppo)
In Android, non è consigliato creare un pulsante "Esci" / "Chiudi" nelle app. Il sistema gestisce il ciclo di vita: utente preme Home/Gesture/Recenti > app va in background (onStop/onPause) > sistema la uccide (onDestroy) quando serve RAM. Forzare chiusura (finish(), System.exit(0), Process.killProcess()) rompe il modello, impedisce salvataggio stato, ripristino rapido, e viola linee guida Material Design / Play Store. Tuttavia, per casi specifici (app kiosk, test, sicurezza alta, logout esplicito), ecco come implementare correttamente.
Approccio Corretto: Logout / Pulizia + finish()
Non "uccidere" il processo. Chiudi l'Activity corrente e rimuovi dallo stack back.
Kotlin (Modern Standard)
// Nel tuo Activity/Fragment, es. click listener su buttonExit
buttonExit.setOnClickListener {
// 1. Pulizia: logout, salva preferenze, ferma servizi, chiudi DB, cancella token sensibili
authRepository.logout()
// 2. Chiudi Activity e rimuovi da back stack
finishAffinity() // Chiude tutte le activity nel task (esce dall'app)
// OPPURE solo questa activity: finish()
// OPPURE per API 21+: finishAndRemoveTask()
}
Java (Legacy)
buttonExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. Pulizia
AuthRepository.getInstance().logout();
// 2. Esci
finishAffinity(); // API 16+ (Jelly Bean)
// finishAndRemoveTask(); // API 21+ (Lollipop)
// System.exit(0); // EVITARE: uccide processo brutalmente, no lifecycle callbacks
}
});
Layout XML (Button)
<Button
android:id="@+id/buttonExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/exit_app" />
<!-- onClick="onExitClick" se usi metodo in Activity (vecchio stile) -->
strings.xml
<string name="exit_app">Esci / Logout</string>
Considerazioni Critiche
- NON USARE:
System.exit(0),Process.killProcess(Process.myPid()),ActivityManager.killBackgroundProcesses(). ImpedisconoonSaveInstanceState(),onDestroy()corretto, causano leak, crash, comportamento anomalo ricarico. - Salva Stato: Override
onSaveInstanceState(Bundle)per salvare UI state (scroll, input, selezione). ViewModel (Architecture Components) sopravvive a ricreazione activity. - Logout Vero: Revoca token, cancella SharedPreferences/Database sensibili, ferma Service/Foreground Service/WorkManager jobs, annulla coroutine/flow, disiscrivi listener/observable.
- Kiosk Mode / Dedicated Device: Usa Android Enterprise / Device Policy Controller (DPC) / Lock Task Mode (
startLockTask()) per bloccare utente in un'app. Non serve pulsante esci. - Test: Usa Android Studio Debugger / Layout Inspector / Logcat. Verifica: nessun leak memoria (LeakCanary), lifecycle corretto, ripristino stato dopo ricreazione (rotazione, kill sistema).
Conclusione: Progetta app per non aver bisogno di pulsante Esci. Usa pattern Android standard: Home per uscire, Back per navigare indietro/chiudere. Se serve logout esplicito: implementa pulizia sessione + finishAffinity().