222 votes

Android - comment à substituer le « retour » touche donc il n ' t méthodefinish() mon activité ?

J'ai actuellement une Activité que, lorsqu'il est affiché un avis est également affiché dans la barre de Notification.

C'est ainsi que lorsque l'Utilisateur appuie sur la maison et l'Activité est poussé à l'arrière-plan, ils peuvent revenir à l'Activité via la Notification.

Le problème se pose lorsqu'un Utilisateur appuie sur le bouton retour, mon Activité est détruite, mais la Notification reste que je veux que l'utilisateur soit capable de presse en arrière, mais encore être en mesure d'obtenir à l'Activité via la Notification. Mais lorsqu'un UTILISATEUR essaie-je obtenir des Pointeurs Null comme d'essayer de démarrer une nouvelle activité, plutôt que de ramener l'ancien.

Donc, essentiellement, je veux que le bouton de Retour à la loi sur exactement le même que le bouton Home 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;
        }   

Toutefois, le code ci-dessus semble encore pour permettre à mon Activité à être détruit, Comment puis-je arrêter mon Activité d'être détruit lors de l'arrière est enfoncé?

310voto

ekawas Points 3288

supprimer l’écouteur de votre clé ou de retourner la valeur true lorsque vous avez KEY_BACK

vous avez juste besoin de ce qui suit pour attraper la touche précédent (veillez à ne pas appeler super)

Aussi, si vous envisagez d’avoir un service exécuté dans le fond, assurez-vous de regarder startForeground() et assurez vous d’avoir une notification en cours ou android va tuer votre service si elle a besoin pour libérer la mémoire``

12voto

kiswa Points 3542

Je pense que ce que vous voulez n'est pas pour remplacer le bouton de retour (qui ne semble pas une bonne idée - système d'exploitation Android définit ce comportement, pourquoi changer?), mais l'utilisation de l' Activité du Cycle de vie et à la persistance de vos paramètres/données dans le onSaveInstanceState(Bundle) de l'événement.

@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 obtenir tout de qui a persisté bundle 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
}

En considération de ces pseudo-code pour vous diriger dans la bonne direction. À la lecture sur l' Activité du Cycle de vie devrait vous aider à déterminer la meilleure façon d'accomplir ce que vous cherchez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X