As technology evolves, the traditional distinction between web and mobile content is beginning to blur. One area where this is particularly true is the growing popularity of progressive web apps, where web apps look and behave much like traditional mobile apps.
Another trend involves making the content within mobile apps discoverable through web searches and via URL links. In the context of Android app development, the App Links feature is designed to make it easier for users to discover and access content stored within an Android app, even if the user does not have the app installed.
An Overview of Android App Links
An app link is a standard HTTP URL that is an easy way to link directly to a particular place in your app from an external source such as a website or app. App links (also called deep links) are used primarily to encourage users to engage with an app and to allow users to share app content.
App link implementation is a multi-step process that involves the addition of intent filters to the project manifest, implementing link handling code within the associated app activities, and the use of digital asset links files to associate app and web-based content.
These steps can be performed manually by making changes within the project or automatically using the Android Studio App Links Assistant.
These steps can be performed manually by making project changes or automatically using the Android Studio App Links Assistant.
The remainder of this chapter will outline app links implementation in terms of the changes that must be made to a project. The next chapter (An Android Studio App Links Tutorial) will demonstrate the use of the App Links Assistant to achieve the same results.
App Link Intent Filters
An app link URL needs to be mapped to a specific activity within an app project. This is achieved by adding intent filters to the project’s AndroidManifest.xml file designed to launch an activity in response to an android.intent.action.VIEW action. The intent filters are declared within the element for the activity to be launched and must contain the data outlining the scheme, host, and path of the app link URL. The following manifest fragment, for example, declares an intent filter to launch an activity named MyActivity when an app link matching http:// www.example.com/welcome is detected:
<activity android:name="com.ebookfrenzy.myapp.MyActivity">
<intent-filter android:autoVerify="true">
<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:pathPrefix="/welcome" />
</intent-filter>
</activity>
Code language: HTML, XML (xml)
The order in which ambiguous intent filters are handled can be specified using the order property of the intent filter tag as follows:
<application>
<activity android:name=" com.ebookfrenzy.myapp.MyActivity">
<intent-filter android:autoVerify="true" android:order="1">
.
.
Code language: HTML, XML (xml)
The intent filter will cause the app link to launch the correct activity, but code must still be added to the target activity to handle the intent appropriately.
Handling App Link Intents
In most cases, the launched activity will need to gain access to the app link URL and take specific action based on how the URL is structured. Continuing from the above example, the activity will likely display different content when launched via a URL containing a path of /welcome/newuser than one with the path set to /welcome/existinguser.
When the link launches the activity, it is passed an intent object containing data about the action which launched the activity, including a Uri object containing the app link URL. Within the initialization stages of the activity, code can be added to extract this data as follows:
val appLinkIntent = intent
val appLinkAction = appLinkIntent.action
val appLinkData = appLinkIntent.data
Code language: Kotlin (kotlin)
Having obtained the Uri for the app link, the various components that make up the URL path can be used to decide the actions to perform within the activity. In the following code example, the last component of the URL is used to identify whether content should be displayed for a new or existing user:
val userType = appLinkData.lastPathSegment
if (userType == "newuser") {
// display new user content
} else {
// display existing user content
}
Code language: Kotlin (kotlin)
Associating the App with a Website
Before an app link will work, an app link URL must be associated with the website on which the app link is based. This is achieved by creating a Digital Asset Links file named assetlinks.json and installing it within the website’s .well-known folder. Note that digital asset linking is only possible for websites that are HTTPS based.
A digital asset links file comprises a relation statement granting permission for a target app to be launched using the website’s link URLs and a target statement declaring the companion app package name and SHA-256 certificate fingerprint for that project. A typical asset link file might, for example, read as follows:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target" : { "namespace": "android_app",
"package_name": "<app package name here>",
"sha256_cert_fingerprints": ["<app certificate here>"] }
}]
Code language: JSON / JSON with Comments (json)
The assetlinks.json file can contain multiple digital asset links, allowing a single website to be associated with more than one companion app.
Summary
Android App Links allow app activities to be launched via URL links from external websites and other apps. App links are implemented using intent filters within the project manifest file and intent handling code within the launched activity. Using a Digital Asset Links file, it is also possible to associate the domain name used in an app link with the corresponding website. Once the association has been established, Android no longer needs to ask the user to select the target app when an app link is used.