Home » Android » android – How to clear intent data in Activity after open from url?

android – How to clear intent data in Activity after open from url?

Posted by: admin June 15, 2020 Leave a comment

Questions:

I have Activity, which can be launched directly from browser, calling url.

Activity code:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Uri data = getIntent().getData();
        Log.d(getClass().getName(), "onCreate data=" + data);

        getIntent().replaceExtras(new Bundle());
        getIntent().setAction("");
        getIntent().setData(null);
        getIntent().setFlags(0);

        if (data != null && isValidUrl(data)) {
            // open some special fragment
        } else {
            // open main fragment
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(MainActivity.class.getName(), "onDestroy");
    }

    //...
}

Application manifest code:

    ...

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>

            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>

            <data
                android:host="example.com"
                android:pathPrefix="/"
                android:scheme="http"/>
        </intent-filter>
    </activity>

    ...

This code works perfectly. When I open application from browser using link (http://example.com/somepage.html), I have this output:

D/com.package.MainActivity: onCreate data=http://example.com/somepage.html

But if I leave the application (using back button) and open application again, from recent menu, I get the same result:

D/com.package.MainActivity: onDestroy
D/com.package.MainActivity: onCreate data=http://example.com/somepage.html

I want to clear intent data in method onCreate. Or is there way to detect, when application is launched from recent menu?

UPD:
I tried to do this:

@Override
protected void onDestroy() {
    super.onDestroy();

    getIntent().replaceExtras(new Bundle());
    getIntent().setAction("");
    getIntent().setData(null);
    getIntent().setFlags(0);

    Log.d(MainActivity.class.getName(), "onDestroy");
}

But it does not help.

How to&Answers:

Quite old thread here, but in case someone else is looking for this one:

You can check if your intent was sent due to app being launched from the recent-list by checking the flag FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

    if ((getIntent().getData() != null) && ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0)) {
            //Handle the url passed through the intent
        } else {
            //proceed as normal
        }

Answer:

Remove intent.getData() by below code:

Edit 1:

Uri data = getIntent().getData();
    Log.d(getClass().getName(), "onCreate data=" + data);

    if (data != null && isValidUrl(data)) {
        // open some special fragment
    } else {
        // open main fragment
    }

getIntent().setData(null);

Edit 2:

getIntent().replaceExtras(new Bundle());
getIntent().setAction("");
getIntent().setData(null);
getIntent().setFlags(0);

Hope this will help you.

Answer:

The way you want to do it goes against the principles of Android system. Android is designed so that Intent opens Activity and then if you want to open this Activity from Recents menu it receives the same intent.

I just guess that if you use one-Activity-many-fragments approach then you see one of its disadvantages. Android Intent system is designed in the way to use One Screen – One Activity approach which is the best practice.

If I’m wrong and you have some other case it would be really interesting to know it. Then you may think of how to redesign the app to achieve your needs.

Answer:

Rather than changing the intent data, you can store the hash of the intent and compare that hash each time the app gets focus. This way you get see if a new intent is present.

Example:

int currentIntent = getIntent().hashCode();

if (lastIntent != currentIntent) {
    // do stuff
}

Answer:

In your onCreate method you have

if (data != null && isValidUrl(data)) {
// open some special fragment
} else {
// open main fragment
}

Change to

if (data != null && isValidUrl(data)) {
    // open some special fragment
    getIntent().setData(null);
    setIntent(getIntent()); //This will set the new intent to have no data,
    //so future launches won't relaunch the data url.
    } else {
    // open main fragment
    }