studio putextra intent intenciones developer desde boton activity abrir android android-intent

android - putextra - Eliminar extras de la intención de transferencia



intent-filter (3)

El problema puede resolverse usando bandera adicional que es persistente durante destruye y recreaciones. Aquí está el código reducido:

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

Tengo una pantalla de búsqueda que se puede iniciar haciendo clic en el campo "nombre" de otra pantalla.

Si el usuario sigue este flujo de trabajo, agrego un extra a los Extras del Intento llamado "búsqueda". Este extra usa el texto que puebla el campo "nombre" como su valor. Cuando se crea la pantalla de búsqueda, ese extra se usa como un parámetro de búsqueda y se inicia automáticamente una búsqueda para el usuario.

Sin embargo, dado que Android destruye y recrea Actividades cuando la pantalla gira, al girar el teléfono se vuelve a realizar una búsqueda automática. Debido a esto, me gustaría eliminar el extra de "búsqueda" del Intento de la actividad cuando se ejecuta la búsqueda inicial.

Intenté hacer esto así:

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

Sin embargo, esto no está funcionando. Si giro la pantalla otra vez, la "búsqueda" adicional todavía existe en los Extras de la intención de la actividad.

¿Algunas ideas?


Lo tengo trabajando.

Parece que getExtras () crea una copia de los extras de Intent.

Si utilizo la siguiente línea, esto funciona bien:

getIntent().removeExtra("search");

Código fuente de getExtras()

/** * Retrieves 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; }


Si bien la respuesta de @ Andrew puede proporcionar un medio para eliminar un Inten extra específico, a veces es necesario borrar TODOS los extras de intención y, en este caso, querrá usar

Intent.replaceExtras(new Bundle())

Código fuente 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; }