Entfernen von Extras aus übergebener Absicht

Lesezeit: 3 Minuten

Ich habe einen Suchbildschirm, der durch Klicken auf ein “Name”-Feld eines anderen Bildschirms gestartet werden kann.

Wenn der Benutzer diesem Workflow folgt, füge ich den Intent-Extras ein Extra namens “Suche” hinzu. Dieses Extra verwendet den Text, der das “Name”-Feld füllt, als seinen Wert. Wenn der Suchbildschirm erstellt wird, wird dieses Extra als Suchparameter verwendet und eine Suche wird automatisch für den Benutzer gestartet.

Da Android jedoch Aktivitäten zerstört und neu erstellt, wenn sich der Bildschirm dreht, führt das Drehen des Telefons erneut zu einer automatischen Suche. Aus diesem Grund möchte ich das Extra „Suchen“ aus der Absicht der Aktivität entfernen, wenn die anfängliche Suche ausgeführt wird.

Ich habe versucht, dies so zu tun:

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

Dies funktioniert jedoch nicht. Wenn ich den Bildschirm erneut drehe, ist das Extra „Suchen“ immer noch in den Extras der Absicht der Aktivität vorhanden.

Irgendwelche Ideen?

Benutzer-Avatar
Andreas

Ich habe es funktioniert.

Es erscheint getExtras() erstellt eine Kopie der Extras des Intent.

Wenn ich die folgende Zeile verwende, funktioniert dies einwandfrei:

getIntent().removeExtra("search");

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

  • Wenn Sie den Wert direkt nach dieser Zeile überprüfen, werden Sie feststellen, dass der Wert nicht aus der Absicht entfernt wurde. Ich habe es auf die gleiche Weise versucht und dann versucht zu sehen, ob die Absicht entfernt wurde oder nicht. getIntent().removeExtra(“Suche”); String searchText = extras.getString(“search”); Der Wert von searchText ist gleich. Ich habe versucht extras.remove(“search”); danach ist der Wert null.

    – Anil Chahal

    8. Dezember 2014 um 7:22 Uhr


  • @AnilChahal Es könnte sein, dass onNewIntent() in der Zwischenzeit aufgerufen wurde und Sie den tatsächlichen ‘Intent’-Wert überschrieben haben

    – Tomi

    24. Dezember 2014 um 17:00 Uhr

  • Eine gute Antwort finden Sie auch hier: stackoverflow.com/questions/20447643/… wenn jemand die Aktivitätsabsicht ändern möchte

    – Gelldur

    31. Juli 2015 um 11:29 Uhr

  • @Andrew Wie entferne ich JEDE Absicht und nicht nur eine Absicht, die durch einen bestimmten String-Wert definiert ist?

    – Martin Erlic

    26. November 2015 um 11:59 Uhr

  • @NewGuy hat das Häkchen bei dieser Antwort entfernt, da es nicht mehr funktioniert.

    – Andreas

    10. August 2018 um 15:39 Uhr

Während die Antwort von @Andrew ein Mittel zum Entfernen eines bestimmten Intent-Extras bieten kann, ist es manchmal notwendig, ALLE Intent-Extras zu löschen, und in diesem Fall möchten Sie sie verwenden

Intent.replaceExtras(new Bundle())

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

  • vorbeigehen Intent.replaceExtras(null) funktioniert auch.

    – lasec0203

    14. Juni 2020 um 6:30 Uhr

Das Problem kann mit einem zusätzlichen Flag gelöst werden, das während Zerstörungen und Wiederherstellungen bestehen bleibt. Hier ist der eingegrenzte Code:

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

  • Ein Nachteil, das ist eine One-Shot-Antwort. Wenn neue Absichten mit neuen Extras einhergehen, wird diese Lösung dies auch nicht berücksichtigen

    – Jemshit Iskenderov

    28. Juli 2017 um 6:57 Uhr

Kotlin

activity?.intent?.removeExtra("key")

1216660cookie-checkEntfernen von Extras aus übergebener Absicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy