Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 842
ArtKorchagin Avatar asked Dec 16 '15 12:12

ArtKorchagin


People also ask

How could you pass data between activities without intent?

This example demonstrate about How to send data from one activity to another in Android without intent. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml.


3 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
        }
like image 122
Ole-Kristian Avatar answered Dec 17 '22 01:12

Ole-Kristian


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.

like image 32
Hiren Patel Avatar answered Dec 16 '22 23:12

Hiren Patel


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.

like image 21
Andrew Panasiuk Avatar answered Dec 17 '22 01:12

Andrew Panasiuk