Handling Deep Links

Introduction

Deep links are URLs that take users directly to specific content in your app. You can set up deep links by adding intent filters and extracting data from incoming intents to drive users to the right screen in your app.

Parameters

<data> AttributeDetails
schemeThe scheme part of a URI (case-sensitive). Examples: http, https, ftp
hostThe host part of a URI (case-sensitive). Examples: google.com, example.org
portThe port part of a URI. Examples: 80, 443
pathThe path part of a URI. Must begin with /. Examples: /, /about
pathPrefixA prefix for the path part of a URI. Examples: /item, /article
pathPatternA pattern to match for the path part of a URI. Examples: /item/.*, /article/[0-9]*
mimeTypeA mime type to match. Examples: image/jpeg, audio/*

Remarks

The <intent-filter>

This combination of <action> and <category> elements is what tells the Android system that a specific Activity should be launched when the user clicks on a link in another application.

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data ... />

</intent-filter>

Multiple <data> tags

The set of deep links that your <intent-filter> supports is the cross-product of all the <data> elements that you define in that intent-filter. The multiple domain, multiple path, and multiple scheme examples demonstrate this.

Resources

Both http and https for the same domain

AndroidManifest.xml:

<activity android:name="com.example.MainActivity" >

    <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:scheme="http" />
        <data android:scheme="https" />
    
        <data android:host="www.example.com" />
    
        <data android:path="/" />
        <data android:path="/map" />
    
    </intent-filter>

</activity>

This will launch your MainActivity when the user clicks any of these links:

  • http://www.example.com/
  • https://www.example.com/
  • http://www.example.com/map
  • https://www.example.com/map

Multiple domains and multiple paths

AndroidManifest.xml:

<activity android:name="com.example.MainActivity" >

    <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:scheme="http"
              android:host="www.example.com" />
    
        <data android:scheme="http"
              android:host="www.example2.com" />
    
        <data android:path="/" />
        <data android:path="/map" />
    
    </intent-filter>

</activity>

This will launch your MainActivity when the user clicks any of these links:

  • http://www.example.com/
  • http://www.example2.com/
  • http://www.example.com/map
  • http://www.example2.com/map

Multiple paths on a single domain

AndroidManifest.xml:

<activity android:name="com.example.MainActivity" >
    
    <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:scheme="http"
              android:host="www.example.com" />

        <data android:path="/" />
        <data android:path="/about" />
        <data android:path="/map" />

    </intent-filter>

</activity>

This will launch your MainActivity when the user clicks any of these links:

  • http://www.example.com/
  • http://www.example.com/about
  • http://www.example.com/map

Retrieving query parameters

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        Intent intent = getIntent();
        Uri data = intent.getData();

        if (data != null) {
            String param1 = data.getQueryParameter("param1");
            String param2 = data.getQueryParameter("param2");
        }
    }

}

If the user clicks on a linkto http://www.example.com/map?param1=FOO&param2=BAR, then param1 here will have a value of "FOO" and param2 will have a value of "BAR".

AndroidManifest.xml:

<activity android:name="com.example.MainActivity" >
    
    <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:scheme="http"
              android:host="www.example.com" />

    </intent-filter>

</activity>

This will accept any link starting with http://www.example.com as a deep link to start your MainActivity.

Using pathPrefix

AndroidManifest.xml:

<activity android:name="com.example.MainActivity" >

    <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:scheme="http"
              android:host="www.example.com"
              android:path="/item" />
    
    </intent-filter>

</activity>

This will launch your MainActivity when the user clicks any link starting with http://www.example.com/item, such as:

  • https://www.example.com/item
  • http://www.example.com/item/1234
  • https://www.example.com/item/xyz/details
NEXT TEXT