Come impedire il ritorno all'attività precedente?


210

Quando si preme il pulsante INDIETRO sul telefono, desidero impedire a un'attività specifica di tornare a quella precedente.

In particolare, ho schermate di accesso e di registrazione, entrambe iniziano una nuova attività chiamata HomeScreenquando si verifica l'accesso / registrazione riusciti. Una volta avviato HomeScreen, desidero impedire agli utenti di tornare all'accesso o di registrare le schermate premendo il tasto BACK.

Ho provato a utilizzare Intent.FLAG_ACTIVITY_NO_HISTORY, ma poiché l'applicazione ha l'integrazione di Facebook, quando si utilizza "Accedi con Facebook", Facebook dovrebbe tornare alla schermata di accesso iniziale, quindi dovrei tenere una cronologia di queste attività.

Ho pensato di ignorare il comportamento del pulsante INDIETRO HomeScreenper terminare direttamente un'applicazione quando si preme il pulsante e l'ho usato

@Override
public void onBackPressed() {
    finish();
}

ma anche quello non funziona.


1
Solo per chiarire, stai cercando di catturare il comportamento per tutti tranne Facebook?
Havexz,

2
In un certo senso sì, ma in realtà quello che voglio è dopo che si è verificato un accesso riuscito e si apre HomeScreen, l'utente non dovrebbe essere in grado di tornare alla schermata di accesso premendo il pulsante INDIETRO. Proprio come Twitter o Foursquare, ad esempio, una volta effettuato l'accesso a tali app, non visualizziamo la pagina di accesso fino a quando non ci disconnettiamo (anche se premiamo BACK dopo aver effettuato l'accesso).
ecem,

Risposte:


345

Il mio suggerimento sarebbe di terminare l'attività a cui non si desidera che gli utenti tornino. Ad esempio, nell'attività di accesso, subito dopo aver chiamato startActivity, chiama finish(). Quando gli utenti premono il pulsante Indietro, non saranno in grado di accedere all'attività di accesso perché è stata eliminata dallo stack.


2
Cosa accadrebbe se il thread nell'attività precedente rimanesse in esecuzione?
AlleyOOP

2
Allora non vorrai seguire il mio approccio. Chiamare finish () sta per uccidere l'attività. Potresti iniziare il processo che desideri eseguire nell'attività che stai per svolgere?
coder

7
Nota: se si chiama finishdurante una transizione condivisa, è possibile che si verifichi un'interruzione dell'attività precedente. ad esempio, se si dispone HomeActivity-> IntermediateActivity-> FinalActivity, e vi invito finish()a IntermediateActivitysubito dopo l'avvio del FinalActivityvedrete il HomeActivityper un breve momento.
David Murdoch,

101

La seguente soluzione può essere molto utile nel normale scenario di accesso / attività principale o implementazione di una schermata di blocco.

Per ridurre a icona l'app anziché tornare all'attività precedente, puoi eseguire l'override in onBackPressed()questo modo:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)lascia il back stack com'è, mette semplicemente il tuo compito (tutte le attività) in background. Come se l'utente avesse premuto il tasto Home .

Parametro boolean nonRoot: se false, funziona solo se l'attività è la radice di un'attività; se vero, funzionerà per qualsiasi attività in un'attività.


3
Perfetto per una schermata di accesso perché mantiene intatta la cronologia.
Hackmodford,

Grazie, ho provato a trovarlo per circa tre giorni. A causa di android: noHistory = Il flag "true" per Activity non funziona come previsto (il flag noHistory ricrea l'attività dopo la minimizzazione) e finish () a volte non ha funzionato per me, ma perché ancora non capisco.
Denshov,

37

Non sono sicuro esattamente quello che vuoi, ma sembra che dovrebbe essere possibile, e sembra anche che tu sia già sulla buona strada.

Ecco alcuni link che potrebbero aiutare:

Disabilita il pulsante Indietro in Android

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

Come posso disabilitare 'torna indietro' ad alcune attività?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
Non posso usare l'opzione noHistory a causa del problema di Facebook che ho cercato di spiegare nella mia domanda e anche in uno dei commenti. Ma la cosa con il pulsante INDIETRO non è disabilitarlo, ma farlo uscire dall'intera applicazione come System.exit(0)viene chiamato (so che non è la migliore pratica, ma volevo solo fare un esempio).
ecem,

Grazie ha funzionato benissimo. L'unico suggerimento che farei qui sarebbe, non c'è bisogno di tornare. Rimuovi super.onBackPressed (); e lascia vuoto il metodo. Funziona anche bene
hyperCoder il

20

Esistono due soluzioni per il tuo caso, l'attività A avvia l'attività B, ma non desideri tornare all'attività A nell'attività B.

1. Rimossa l'attività precedente A dallo stack posteriore.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Disabilitato tornare all'azione del pulsante nell'attività B.

Esistono due modi per impedire il ritorno all'evento come di seguito,

1) Raccomanda l'approccio

@Override
public void onBackPressed() {
}

2) Sostituisci metodo onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Spero che sia utile, ma dipende ancora dalle tue situazioni.


3
Non è una brutta esperienza utente disabilitare onBackPressed ()?
C. Skjerdal

Dipende totalmente da cosa stai cercando di fare, nella funzionalità delle app ha bisogno di questo, quindi provaci.
user3099225

È incredibile come mi sia completamente dimenticato del primo metodo utilizzato finish(). Riflessione non necessaria con nohistoryattributi, flag di intenti, tag manifest di attività padre, ecc. Stupido, grazie per la risposta!
varun

8

Dal momento che ci sono già molte soluzioni suggerite, cercherò di dare una spiegazione più avvincente.

Come saltare tornando all'attività precedente?

Rimuovi l'attività precedente dal backstack. Semplice

Come rimuovere l'attività precedente dal backstack?

finish()Metodo di chiamata

Il flusso normale:

inserisci qui la descrizione dell'immagine
Tutte le attività sono archiviate in uno stack noto come Backstack.
Quando si avvia una nuova attività ( startActivity(...)), la nuova attività viene spinta in cima allo stack e quando si preme il pulsante indietro, l'attività viene estratta dallo stack.
Un punto chiave da notare è che quando si preme il pulsante Indietro, il finish();metodo viene chiamato internamente. Questo è il comportamento predefinito del metodo onBackPressed ().

Quindi se vuoi saltare l'attività B?

cioè A <--- C

Aggiungi il finish();metodo dopo il tuo startActvity(...)nell'Attività B.

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

inserisci qui la descrizione dell'immagine


6

finish()ti dà il metodo per chiudere l'attività corrente non l'intera applicazione. E faresti meglio a non cercare metodi per uccidere l'applicazione. Piccolo consiglio

Hai provato la congiunzione di Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Ricorda di usare questi flag Intentall'inizio dell'attività!


2
FLAG_ACTIVITY_NO_HISTORYimpedisce al mio LoginScreen di catturare la richiamata di Facebook quando si utilizza l'accesso con Facebook. Perché una volta che lo stato attivo esce dalla schermata di accesso, non può essere ripristinato (poiché non è presente alcuna cronologia). Ma non l'ho provato con Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, lo controllerò, grazie!
ecem,

anche grazie del finish()metodo, non lo sapevo.
ecem,

4

Metti finish()subito dopo

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
Questo è fondamentalmente ciò che diceva la risposta accettata di quattro anni prima.
TylerH,

3

La risposta di paulsm4 è quella corretta. Se onBackPressed()tornerai, disabiliterà il pulsante Indietro. Tuttavia, penso che un approccio migliore dato che il tuo caso d'uso sia quello di capovolgere la logica dell'attività, ovvero rendere l'attività principale la tua casa principale, verificare se l'utente ha effettuato l'accesso, altrimenti avviare l'attività di accesso. Il motivo è che se si annulla il pulsante Indietro nella propria attività principale, la maggior parte degli utenti verrà confusa quando si preme indietro e l'app non fa nulla.



3

Questo metodo funziona bene

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

Basta ignorare il metodo onKeyDown e verificare se è stato premuto il pulsante Indietro.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

Quando si crea onBackPressed()basta rimuovere super.onBackPressed();e dovrebbe funzionare


1

Mettere

finish();

subito dopo ActivityStart per interrompere l'attività impedendo qualsiasi modo di tornare ad essa. Poi aggiungi

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

all'attività che stai iniziando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.