2010-01-04 12 views
232

Premendo il pulsante Indietro, vorrei che la mia applicazione passasse nello stato di arresto, piuttosto che nello stato distrutto.Ignora pulsante Indietro per agire come pulsante di casa

Nel Android docs afferma:

... non tutte le attività hanno il comportamento che vengono distrutte quando viene premuto BACK. Quando l'utente avvia la riproduzione di musica nell'applicazione Musica e poi preme INDIETRO, l'applicazione esegue l'override del comportamento di nuovo normale, impedendo l'attività di giocatore di essere distrutto, e continua la riproduzione di musica, anche se la sua attività non è più visibile

Come si replica questa funzionalità nella mia applicazione?

Penso che ci deve essere tre possibilità ...

  1. catturare il pulsante posteriore (come sotto) e quindi chiamare qualunque metodo (s) le chiamate pulsante Home.

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
        if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
         Log.d(this.getClass().getName(), "back button pressed"); 
        } 
        return super.onKeyDown(keyCode, event); 
    } 
    
  2. Cattura il tasto back stampa e quindi falsificare una pressa tasto home.

  3. Catturare il pulsante Indietro premere, quindi avviare un'attività della schermata iniziale, mettendo effettivamente l'attività della mia applicazione nello stato di arresto.

Edit: so di servizi e sto usando uno in applicazione a cui questo problema è correlato. Questa domanda riguarda specificamente l'attivazione dell'attività nello stato di arresto anziché lo stato distrutto premendo il pulsante Indietro.

+0

vedere una risposta simile http://stackoverflow.com/questions/5914040/onbackpressed-to-hide-not-destroy-activity/23759328#23759328 – Nepster

risposta

324

La maggior parte delle volte è necessario creare un Service per eseguire qualcosa sullo sfondo e il tuo Activity visibile semplicemente controlla questo Service. (Sono sicuro che il lettore musicale funziona allo stesso modo, quindi l'esempio nella documentazione sembra un po 'fuorviante.) Se questo è il caso, allora il tuo-può finish come al solito e lo Service sarà ancora in esecuzione.

Un approccio più semplice è quello di catturare il Back premere il pulsante e chiamare moveTaskToBack(true) come segue:

// 2.0 and above 
@Override 
public void onBackPressed() { 
    moveTaskToBack(true); 
} 

// Before 2.0 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

penso che l'opzione preferita dovrebbe essere per un'attività per terminare normalmente ed essere in grado di ricrearsi esempio leggendo lo stato corrente da un servizio se necessario. Ma il moveTaskToBack può essere usato come una rapida alternativa a volte.

NOTA: come ha sottolineato Dave sotto Android 2.0 ha introdotto un nuovo metodo di onBackPressed e these recommendations su come gestire il pulsante Indietro.

+1

moveTaskToBack() sembra funzionare come desiderato. Quali potrebbero essere i lati negativi dell'uso di questo metodo? Ci sono casi in cui questo potrebbe non funzionare come previsto? – bdls

+1

Dopo aver letto il suo documento con più attenzione, in realtà penso che dovrebbe funzionare bene. (Inizialmente pensavo si applicasse all'attività, ma in realtà dice "l'attività che contiene questa attività".) Ma dovresti testarlo per te stesso, naturalmente. :) –

+0

Grazie a Mirko, il metodo sembra funzionare bene. Potrebbe essere interessante se si dà maggiore risalto alla modifica nella parte inferiore della risposta per coloro che stanno guardando questa domanda in seguito, poiché quello era il bit che stavo cercando! – bdls

22

Se si desidera prendere il pulsante Indietro, dare un'occhiata a this post on the Android Developer Blog. Copre il modo più semplice per farlo in Android 2.0 e il modo migliore per farlo per un'applicazione che gira su 1.xe 2.0.

Tuttavia, se l'attività è interrotta, potrebbe comunque essere interrotta a seconda della disponibilità di memoria sul dispositivo. Se si desidera eseguire un processo senza interfaccia utente, è necessario creare uno Service. The documentation says the following about Services:

Un servizio non ha un'interfaccia utente visiva, ma viene eseguito in background per un periodo di tempo indefinito. Ad esempio, un servizio potrebbe riprodurre musica di sottofondo mentre l'utente si occupa di altri argomenti, oppure potrebbe recuperare i dati sulla rete o calcolare qualcosa e fornire il risultato alle attività che ne hanno bisogno.

Questi sembrano appropriati per le vostre esigenze.

17

provare a eseguire l'override void onBackPressed() definito in android.app.Activity class.

+1

da Android 2.0 questa è la cosa giusta da ignorare. http://developer.android.com/sdk/android-2.0.html – jay

+2

16 upvotes per una risposta del genere ... il 2011 era un momento diverso ... – GabrielOshiro

13

se aiuta qualcun altro, ho avuto un'attività con 2 layout che ho attivato e disattivato per visibilità, cercando di emulare un tipo di struttura pagina1> pagina2. se erano a pagina 2 e premevano il pulsante indietro, volevo che tornassero alla pagina 1, se premevano il pulsante indietro a pagina 1, avrebbe dovuto funzionare normalmente. La sua piuttosto semplice, ma funziona

@Override 
public void onBackPressed() { 
// check if page 2 is open 
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout); 
    if(page2layout.getVisibility() == View.VISIBLE){ 
     togglePageLayout(); // my method to toggle the views 
     return; 
    }else{ 
     super.onBackPressed(); // allows standard use of backbutton for page 1 
    } 

} 

Speranza che aiuta qualcuno, applausi

-1

devo usare @Mirko N. answser realizzato utilizzando il nuovo personalizzato EditText

public class EditViewCustom extends EditText { 

    Button cancelBtn; 
    RelativeLayout titleReleLayout; 
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public EditViewCustom(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public EditViewCustom(Context context) { 
     super(context); 
    } 

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){ 
     this.cancelBtn = cancelBtn; 
     this.titleReleLayout = titleReleLayout; 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
      Log.d("KEYCODE_BACK","KEYCODE_BACK"); 
      cancelBtn.setVisibility(View.GONE); 
      this.setFocusableInTouchMode(false); 
      this.setFocusable(false); 
      titleReleLayout.setVisibility(View.VISIBLE); 

      return super.onKeyPreIme(keyCode, event); 
      } 

     return super.onKeyPreIme(keyCode, event); 
    } 

} 

Quindi impostare i dati dal vostro attività

searchEditView.setViews(cancelBtn, titleRelativeLayout); 

Grazie.

42

utilizzare il seguente codice:

public void onBackPressed() {  
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    startActivity(intent); 
} 
0

Ancora meglio, come su OnPause():

Chiamato come parte del ciclo di vita di attività quando un'attività sta andando in secondo piano, ma non ha (ancora) stato ucciso. La controparte di onResume().

Quando l'attività B viene avviata di fronte all'attività A, questa richiamata verrà invocata su A. B non verrà creato fino a quando non viene restituito A onPause(), quindi assicurati di non fare nulla di significativo in questo punto.

Questo callback è utilizzato principalmente per salvare qualsiasi stato persistente che l'attività sta modificando e per assicurarsi che non si perda nulla se non ci sono risorse sufficienti per avviare la nuova attività senza aver prima eliminato questo.

Questo è anche un buon posto per fare cose come fermare le animazioni e altre cose che consumano una notevole quantità di CPU per poter passare alla prossima attività il più velocemente possibile, o per chiudere le risorse che sono accesso esclusivo come come la fotocamera.

8

esempio Lavorare ..

Assicurarsi che non chiamare super.onBackPressed();

@Override 
public void onBackPressed() { 
    Log.d("CDA", "onBackPressed Called"); 
    Intent setIntent = new Intent(Intent.ACTION_MAIN); 
    setIntent.addCategory(Intent.CATEGORY_HOME); 
    setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(setIntent); 
} 

In questo modo il pulsante Indietro si comporta come il pulsante Home.Non finisce la vostra attività, ma portarla al fondo

secondo modo è quello di chiamare in moveTaskToBack(true);onBackPressed e assicurarsi di rimuovere super.onBackPressed

0

Override onBackPressed() dopo Android 2.0. Come

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