web-dev-qa-db-fra.com

Android - Comment remplacer le bouton "Retour" afin qu'il ne termine pas () mon activité?

J'ai actuellement une activité qui, lorsqu'elle s'affiche, affiche également une notification dans la barre de notification.

Ainsi, lorsque l'utilisateur rentre chez lui et que l'activité passe en arrière-plan, il peut revenir à l'activité via la notification.

Le problème se pose lorsqu'un utilisateur appuie sur le bouton Précédent, mon activité est détruite, mais la notification reste inchangée car je souhaite que l'utilisateur puisse appuyer à nouveau, tout en pouvant accéder à l'activité via la notification. Mais quand un utilisateur essaie ceci, Null Pointers essaie de démarrer une nouvelle activité plutôt que de ramener l'ancienne.

Donc, je veux essentiellement que le bouton Précédent agisse exactement de la même manière que le bouton Accueil et voici comment j'ai essayé jusqu'à présent:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(Android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

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

            return;
        }   

Cependant, le code ci-dessus semble toujours autoriser la destruction de mon activité. Comment puis-je empêcher la destruction de mon activité lorsque le bouton de retour est enfoncé?

178
Donal Rafferty

Supprimez votre écouteur de clé ou renvoyez true lorsque vous avez KEY_BACK.

Vous avez juste besoin des éléments suivants pour saisir la touche de retour (Assurez-vous de ne pas appeler super in onBackPressed()).

En outre, si vous prévoyez de faire fonctionner un service en arrière-plan, veillez à consulter startForeground() et assurez-vous d'avoir une notification en cours, sinon Android supprimera votre service s'il doit libérer de la mémoire.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (Integer.parseInt(Android.os.Build.VERSION.SDK) > 5
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        Log.d("CDA", "onKeyDown Called");
        onBackPressed();
        return true; 
    }
    return super.onKeyDown(keyCode, event);
}


@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);
}
248
ekawas

Il était plus facile de l'implémenter avec une seule ligne de code:

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

Je pense que ce que vous voulez, ce n'est pas de remplacer le bouton de retour (cela ne semble pas être une bonne idée - Android OS définit ce comportement, pourquoi le changer?), Mais d'utiliser le Activity Lifecycle et de conserver vos paramètres/data dans le onSaveInstanceState (Bundle) .

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

Ensuite, vous utilisez onCreate (Bundle) pour tout extraire de ce bundle persistant et recréer votre état.

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

Considérez le code ci-dessus pour vous orienter dans la bonne direction. En lisant le Cycle de vie d'une activité devrait vous aider à déterminer le meilleur moyen d'accomplir ce que vous cherchez.

12
kiswa

faites simplement ceci ..

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

commenter le //super.onBackPressed (); fera l'affaire

10
androCoder-BD

Essaye ça:

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

Juste au cas où vous souhaiteriez gérer le comportement du bouton de retour (au bas du téléphone) et du bouton de démarrage (celui situé à gauche de la barre d’action), cette activité personnalisée que j’utilise dans mon projet peut vous aider. .

import Android.os.Bundle;
import Android.support.v7.app.ActionBar;
import Android.support.v7.app.AppCompatActivity;
import Android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case Android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

Exemple d'utilisation dans votre activité:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}
1
Ferran Maylinch
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)
0
user3156040