Enabling Deep Links for App Content in Android

To enable Google to crawl your app content and allow users to enter your app from search results, you must add intent filters for the relevant activities in your app manifest. These intent filters allow deep linking to the content in any of your activities. For example, the user might click on a deep link to view a page within a shopping app that describes a product offering that the user is searching for.

Add Intent Filters for Your Deep Links

To create a deep link to your app content, add an intent filter that contains these elements and attribute values in your manifest:

<action>

Specify the ACTION_VIEW intent action so that the intent filter can be reached from Google Search.

<data>

Add one or more <data> tags, where each tag represents a URI format that resolves to the activity. At minimum, the <data> tag must include theandroid:scheme attribute.You can add additional attributes to further refine the type of URI that the activity accepts. For example, you might have multiple activities that accept similar URIs, but which differ simply based on the path name. In this case, use the android:path attribute or its variants (pathPattern orpathPrefix) to differentiate which activity the system should open for different URI paths.

<category>

Include the BROWSABLE category. The BROWSABLE category is required in order for the intent filter to be accessible from a web browser. Without it, clicking a link in a browser cannot resolve to your app. The DEFAULT category is optional, but recommended. Without this category, the activity can be started only with an explicit intent, using your app component name.

The following XML snippet shows how you might specify an intent filter in your manifest for deep linking. The URIs “example://gizmos” and“http://www.example.com/gizmos” both resolve to this activity.

<activityandroid:name="com.example.android.GizmosActivity"android:label="@string/title_gizmos"><intent-filterandroid:label="@string/filter_title_viewgizmos"><actionandroid:name="android.intent.action.VIEW"/><categoryandroid:name="android.intent.category.DEFAULT"/><categoryandroid:name="android.intent.category.BROWSABLE"/><!-- Accepts URIs that begin with "http://www.example.com/gizmos” --><dataandroid:scheme="http"android:host="www.example.com"android:pathPrefix="/gizmos"/><!-- note that the leading "/" is required for pathPrefix--><!-- Accepts URIs that begin with "example://gizmos” --><dataandroid:scheme="example"android:host="gizmos"/></intent-filter></activity>

Once you’ve added intent filters with URIs for activity content to your app manifest, Android is able to route any Intent that has matching URIs to your app at runtime.

Note: Intent filters may only contain a single data element for a URI pattern. Create separate intent filters to capture additional URI patterns.

To learn more about defining intent filters, see Allow Other Apps to Start Your Activity.

Read Data from Incoming Intents

Once the system starts your activity through an intent filter, you can use data provided by the Intent to determine what you need to render. Call thegetData() and getAction() methods to retrieve the data and action associated with the incoming Intent. You can call these methods at any time during the lifecycle of the activity, but you should generally do so during early callbacks such as onCreate() or onStart().

The deep link should take users directly to the content, without any prompts, interstitial pages, or logins. Make sure that users can see the app content even if they never previously opened the application. It is okay to prompt users on subsequent interactions or when they open the app from the Launcher. This is the same principle as the first click free experience for web sites.

Follow the design guidance described in Navigation with Back and Up so that your app matches users’ expectations for backward navigation after they enter your app through a deep link.

Test Your Deep Links

You can use the Android Debug Bridge with the activity manager (am) tool to test that the intent filter URIs you specified for deep linking resolve to the correct app activity. You can run the adb command against a device or an emulator.