Suppression des extras de l’intention passée

J’ai un écran de recherche qui peut être lancé en cliquant sur un champ “nom” d’un autre écran.

Si l’utilisateur suit ce stream de travail, j’ajoute un extra aux extras d’intention appelé “search”. Cet extra utilise le texte remplissant le champ “name” comme valeur. Lorsque l’écran de recherche est créé, cet élément supplémentaire est utilisé comme paramètre de recherche et une recherche est automatiquement lancée pour l’utilisateur.

Toutefois, comme Android détruit et recrée les activités lorsque l’écran pivote, la rotation du téléphone provoque une nouvelle recherche automatique. Pour cette raison, je voudrais supprimer la “recherche” supplémentaire de l’intention de l’activité lorsque la recherche initiale est exécutée.

J’ai essayé de faire comme ça:

Bundle extras = getIntent().getExtras(); if (extras != null) { if (extras.containsKey("search")) { mFilter.setText(extras.getSsortingng("search")); launchSearchThread(true); extras.remove("search"); } } 

Cependant, cela ne fonctionne pas. Si je fais pivoter à nouveau l’écran, le “recherche” supplémentaire existe toujours dans les extras d’intention de l’activité.

Des idées?

Je le fais fonctionner

Il semble que getExtras () crée une copie des extras de l’intention.

Si j’utilise la ligne suivante, cela fonctionne bien:

 getIntent().removeExtra("search"); 

Code source de getExtras()

 /** * Resortingeves a map of extended data from the intent. * * @return the map of all extras previously added with putExtra(), * or null if none have been added. */ public Bundle getExtras() { return (mExtras != null) ? new Bundle(mExtras) : null; } 

Le problème peut être résolu en utilisant un drapeau supplémentaire persistant pendant les destructions et les récréations. Voici le code réduit:

 boolean mProcessed; @Override protected void onCreate(Bundle state) { super.onCreate(state); mProcessed = (null != state) && state.getBoolean("state-processed"); processIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); mProcessed = false; processIntent(intent); } @Override protected void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); state.putBoolean("state-processed", mProcessed); } protected void processIntent(Intent intent) { // do your processing mProcessed = true; } 

Bien que la réponse de @Andrew puisse être un moyen de supprimer un Intent spécifique, il est parfois nécessaire d’effacer TOUS les extras intentionnels et, dans ce cas, vous souhaiterez utiliser

 Intent.replaceExtras(new Bundle()) 

Code source de replaceExtras :

 /** * Completely replace the extras in the Intent with the given Bundle of * extras. * * @param extras The new set of extras in the Intent, or null to erase * all extras. */ public @NonNull Intent replaceExtras(@NonNull Bundle extras) { mExtras = extras != null ? new Bundle(extras) : null; return this; }