2011-12-25 19 views
148

Voglio farlo su Android: in pratica quando si preme il tasto BACK sul telefono, voglio impedire a un'attività specifica di tornare alla precedente.Android: impedendo di tornare all'attività precedente

In particolare, sono presenti schermate di accesso e registrazione, entrambe iniziano una nuova attività chiamata HomeScreen quando si verifica l'accesso/registrazione avvenuta correttamente. Una volta avviato HomeScreen, voglio impedire agli utenti di poter tornare al login o iscriversi schermate premendo il tasto BACK.

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

ho pensato di rilevante comportamento del tasto BACK sul HomeScreen a finire direttamente applicazione quando si preme il pulsante e ho usato

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

ma che anche non funziona.

Sono abbastanza nuovo nello sviluppo di Android, quindi qualsiasi aiuto sarebbe molto utile.

Grazie in anticipo.

+0

Giusto per chiarire, è cercando di catturare di nuovo il comportamento per tutti tranne facebook? – havexz

+0

In un certo senso si, ma in realtà quello che voglio è dopo che si è verificato il login e l'HomeScreen si apre, l'utente non dovrebbe essere in grado di tornare alla schermata di accesso premendo il pulsante INDIETRO. Ad esempio, proprio come Twitter o Foursquare, una volta che effettuiamo l'accesso a tali app, non visualizziamo la pagina di accesso finché non ci disconnettiamo (anche se premiamo BACK dopo l'accesso). – ecem

risposta

267

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

+11

Sì, quello era quello che stavo cercando! Chiamare 'finish()' quando ho finito con quell'attività impedisce totalmente di tornare indietro. Grazie mille! – ecem

+1

Cosa succede se desidero che il thread dell'attività precedente rimanga in esecuzione? – AlleyOOP

+0

Allora non vorresti seguire il mio approccio. Calling finish() sta per uccidere l'attività. Potresti iniziare il tuo processo che vuoi eseguire nell'attività che stai per intraprendere? – coder

28

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

Qui ci sono alcuni link che potrebbero aiutare:

Disable back button in android

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

     return; 
    } 

How can I disable 'go back' to some activity?

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 tasto BACK non la disabilita, ma farla uscire dall'intera applicazione come 'System.exit (0)' viene chiamata (so che non è la practive migliore, ma volevo solo dare un esempio). – ecem

+1

ritorno da vuoto? –

5

finish() ti dà modo di chiudere attività in corso non intera applicazione. E è meglio non provare a cercare metodi per uccidere l'applicazione. Piccolo consiglio.

Hai provato la combinazione di Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Ricorda di usare questi flag nell'attività di avvio Intent!

+1

'FLAG_ACTIVITY_NO_HISTORY' impedisce al mio LoginScreen di catturare la richiamata di Facebook quando si utilizza l'accesso con Facebook. Perché una volta che lo stato attivo si spegne da LoginScreen, non può essere ripreso (poiché non esiste una cronologia). Ma non l'ho provato con 'Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS', lo controllerò, grazie! – ecem

+0

anche grazie al metodo 'finish()', non lo sapevo. – ecem

2

La risposta di paulsm4 è corretta. Se in onBackPressed() si ritorna, disabiliterà il pulsante Indietro. Tuttavia, ritengo che un approccio migliore, dato il tuo caso d'uso, sia quello di capovolgere la logica di attività, cioè rendere la tua attività principale quella principale, controllare se l'utente è registrato lì, altrimenti avviare l'attività di accesso. Il motivo è che se si esclude il pulsante Indietro nella propria attività principale, la maggior parte degli utenti verrà confusa quando si preme indietro e l'app non fa nulla.

80

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

Per ridurre al minimo l'applicazione, piuttosto che tornare all'attività precedente, è possibile ignorare onBackPressed() in questo modo:

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

moveTaskToBack(boolean nonRoot) lascia la pila avanti così com'è, appena mette il vostro compito (tutte le attività) in background. Come se l'utente avesse premuto il tasto Home.

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

+7

Funziona alla grande! Esattamente quello di cui avevo bisogno. Grazie! – avb

+0

Questo mi ha aiutato. Grazie! – Shami

+0

Questa è la risposta che ha funzionato. – Everett

0

Mettere

finish(); 

Subito dopo ActivityStart per interrompere l'attività per prevenire ogni modo di tornare ad essa. Quindi aggiungere

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

Per l'attività che si sta avviando.

1

Basta sovrascrivere il metodo onKeyDown e controllare 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; 
} 
3

Mettere finish() subito dopo

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

Ci sono due soluzioni per il tuo caso come se l'attività A s Agisci all'attività B, ma non vuoi tornare all'attività A nell'attività B.

1. Rimosso 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. disabili tornare indietro azione del pulsante.

Ci sono due modi per prevenire tornare evento come di seguito,

1) Consiglia approccio

@Override 
public void onBackPressed() { 
} 

2) Azionamento onKeyDown metodo

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

speranza che è utile ma dipende comunque dalle tue situazioni.

Buona fortuna @[email protected]

Luna

1

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); 
Problemi correlati