Removing extras from passed-in Intent

前端 未结 3 905
天命终不由人
天命终不由人 2021-02-01 00:22

I have a search screen which can be launched from clicking on a \"name\" field of another screen.

If the user follows this workflow, I add an extra to the Intent\'s Extr

相关标签:
3条回答
  • 2021-02-01 00:51

    I have it working.

    It appears getExtras() creates a copy of the Intent's extras.

    If I use the following line, this works fine:

    getIntent().removeExtra("search");
    

    Source code of 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;
    }
    
    0 讨论(0)
  • 2021-02-01 00:59

    The problem can be solved using extra flag which is persistent during destroys and recreations. Here is the narrowed down 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;
    }
    
    0 讨论(0)
  • 2021-02-01 01:12

    While @Andrew's answer may provide a means for removing a specific Intent extra, sometimes it is necessary to clear ALL of the intent extras and, in this case, you will want to use

    Intent.replaceExtras(new Bundle())
    

    Source code of 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;
    }
    
    0 讨论(0)
提交回复
热议问题