Domanda

Premendo il pulsante Indietro, vorrei che la mia applicazione passasse allo stato interrotto, anziché allo stato distrutto.

Nell'Android documenti afferma:

...non tutte le attività hanno il comportamento di essere distrutte quando si preme BACK.Quando l'utente inizia a riprodurre musica nell'applicazione Musica e quindi preme INDIETRO, l'applicazione sovrascrive il normale comportamento della funzione Indietro, impedendo che l'attività del lettore venga distrutta e continua a riprodurre musica, anche se la sua attività non è più visibile

Come posso replicare questa funzionalità nella mia applicazione?

Penso che ci siano tre possibilità...

  1. Cattura la pressione del pulsante Indietro (come di seguito) e quindi chiama i metodi chiamati dal 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 la pressione del pulsante Indietro e quindi falsifica la pressione del pulsante Home.

  3. Cattura la pressione del pulsante Indietro, quindi avvia un'attività della schermata iniziale, mettendo effettivamente l'attività della mia applicazione nello stato interrotto.

Modificare:Conosco i servizi e ne sto utilizzando uno nell'applicazione a cui è correlato questo problema.Questa domanda riguarda specificamente il mettere l'attività nello stato interrotto anziché nello stato distrutto premendo il pulsante Indietro.

È stato utile?

Soluzione

La maggior parte delle volte è necessario creare un file Servizio per eseguire qualcosa in sottofondo e visibile Activity controlla semplicemente questo Service.(Sono sicuro che il lettore musicale funzioni allo stesso modo, quindi l'esempio nella documentazione sembra un po' fuorviante.) Se è così, allora il tuo Activity Potere finish come al solito e il Service sarà ancora in esecuzione.

Un approccio più semplice consiste nell'acquisire il file 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 che un'attività finisca normalmente e sia in grado di ricrearsi, ad es.leggere lo stato corrente da un servizio, se necessario.Ma moveTaskToBack può essere usato come alternativa rapida in alcune occasioni.

NOTA:come sottolineato da Dave di seguito, Android 2.0 ha introdotto una novità onBackPressed metodo e queste raccomandazioni su come gestire il pulsante Indietro.

Altri suggerimenti

Con il seguente codice:

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

Se si desidera catturare il pulsante Indietro dare un'occhiata a questo post sul Blog degli sviluppatori Android . Esso copre il modo più semplice per fare questo in Android 2.0 e il modo migliore per fare questo per un'applicazione che gira su 1.xe 2.0.

Tuttavia, se il vostro attività è Interrotto può ancora essere ucciso a seconda della disponibilità di memoria sul dispositivo. Se si desidera un processo di eseguire senza interfaccia utente è necessario creare un Service. La documentazione dice quanto segue riguardo Servizi:

  

Un servizio non dispone di un'interfaccia utente visiva, ma piuttosto viene eseguito in background per un periodo di tempo indefinito. Ad esempio, un servizio potrebbe riprodurre musica di sottofondo come l'utente si occupa di altre questioni, o potrebbe recuperare i dati attraverso la rete o calcolare qualcosa e fornire il risultato di attività che ne hanno bisogno.

Questi sembra appropriato per le vostre esigenze.

cercare di ignorare onBackPressed() vuoto definito in classe android.app.Activity.

se aiuta qualcun altro, ho avuto un'attività con 2 layout che ho attivata e disattivata per visibilità, cercando di emulare una sorta di pagina1> Struttura page2. se fossero a pagina 2 e premuto il pulsante indietro che volevo loro di andare di nuovo alla pagina 1, se si preme il pulsante di nuovo a pagina 1 dovrebbe ancora 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
    }

}

Spero che aiuta qualcuno, applausi

Esempio di applicazione ..

Assicurati 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 agire come pulsante Home. Non finisce la vostra attività, ma portarla al fondo

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

Ancora meglio, come su OnPause () :

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

Quando l'attività B viene lanciato davanti l'attività A, questo callback verrà richiamato su A. B non verrà creato fino di un onPause () restituisce, in modo da essere sicuri toenter code here non fare nulla lungo qui.

Questa callback è usato soprattutto per il salvataggio di qualsiasi stato persistente l'attività sta modificando e assicurandosi che nulla è perduto, se non ci sono abbastanza risorse per avviare la nuova attività senza prima aver ucciso questo.

Questo è anche un buon posto per fare le cose come le animazioni di arresto e altre cose che consumano una notevole quantità di CPU al fine di effettuare il passaggio alla prossima attività il più velocemente possibile, o per chiudere le risorse che sono l'accesso esclusivo come la macchina fotografica.

Override onBackPressed () dopo Android 2.0. Come ad esempio

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

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

 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);
    }

}

Poi set di dati dalla vostra attività

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Grazie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top