Skip to content
Tolinku
Tolinku
Sign In Start Free
Android Development · · 6 min read

Android 13 and 14 Deep Link Updates

By Tolinku Staff
|
Tolinku app links dashboard screenshot for android blog posts

Each Android version adjusts how deep links and App Links behave. Android 12 made the biggest changes in recent years (mandatory verification, web intent changes). Android 13 and 14 continued that trajectory with more refinements to intent handling, verification behavior, and user-facing link controls.

This guide covers the deep linking changes in Android 13 (API 33) and Android 14 (API 34) that affect how your app handles and receives links. For the Android 12 changes, see Android 12+ App Links changes. For the full App Links setup, see the Android App Links complete guide.

Android 13 (API 33) Changes

Intent Filter Matching Changes

Android 13 made intent filter matching stricter for intents that target specific components.

What changed: When an intent explicitly targets a component (via setComponent() or setClassName()), the system now validates that the component's intent filter actually matches the intent's action, data, and categories. Previously, explicit intents bypassed filter matching entirely.

Impact on deep linking: If your app sends explicit intents to internal Activities for deep link routing, those Activities must now have matching intent filters. This catches a common mistake where developers add explicit intents to Activities that don't declare the correct filters.

<!-- This Activity MUST have an intent filter that matches the intent -->
<activity
    android:name=".ProductDetailActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="https"
              android:host="yourapp.com"
              android:pathPrefix="/products" />
    </intent-filter>
</activity>

Android 13 introduced the Photo Picker, which changes how apps share images. While not directly a deep linking change, it affects apps that generate shareable content with deep link overlays (like achievement cards or promotional images with embedded links).

The Photo Picker doesn't pass along custom metadata from shared images, so if your app relies on image metadata for deep link attribution, you need an alternative approach (like embedding the link in the share text alongside the image).

Per-App Language Preferences

Android 13 added per-app language preferences. This affects deep link landing screens: when a user opens a deep link, the app should respect their per-app language preference, not the system locale.

// Get the user's per-app language preference
val appLocale = AppCompatDelegate.getApplicationLocales()

// Apply it when rendering deep link content
fun onDeepLinkReceived(uri: Uri) {
    val locale = appLocale.toLanguageTags()
    loadContent(uri.path, locale)
}

Notification Permission (POST_NOTIFICATIONS)

Android 13 requires the POST_NOTIFICATIONS runtime permission. This affects deep linking workflows that send notifications as part of the referral or engagement flow.

If your app sends push notifications when a referral is completed or when a deep link campaign triggers a follow-up, request the notification permission before attempting to send:

// Check and request notification permission (Android 13+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS)
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(
            arrayOf(Manifest.permission.POST_NOTIFICATIONS),
            REQUEST_NOTIFICATION_PERMISSION
        )
    }
}

Without this permission, notifications fail silently. Users who arrived via deep links and expected a notification (e.g., "We'll notify you when your referral reward is ready") won't receive it.

Android 14 (API 34) Changes

Stricter Intent Handling

Android 14 further tightened intent handling with several changes that affect deep linking:

Implicit intent restrictions: Apps targeting API 34 cannot send implicit intents to internal components. If your app routes deep links by broadcasting implicit intents between Activities or Services, you must switch to explicit intents.

// BROKEN on Android 14 (targeting API 34): implicit intent to internal component
val intent = Intent("com.example.app.DEEP_LINK")
intent.putExtra("url", deepLinkUrl)
sendBroadcast(intent) // Fails silently

// FIX: use explicit intent
val intent = Intent(this, DeepLinkReceiver::class.java)
intent.putExtra("url", deepLinkUrl)
sendBroadcast(intent) // Works

Exported receivers require filters: Any receiver that's exported must have an intent filter. This was a best practice before; now it's enforced. If your app has a broadcast receiver for deep link events without an intent filter, it will crash on Android 14.

Android 14 improved the Digital Asset Links verification process:

Faster re-verification. The system re-verifies App Links more frequently and handles server errors more gracefully. On Android 12-13, a single verification failure could leave your app in an unverified state until the user cleared data or reinstalled. Android 14 retries more aggressively.

Better error reporting. The adb shell pm get-app-links command provides more detailed status information on Android 14, making it easier to diagnose verification failures.

# Android 14 provides more detail
adb shell pm get-app-links --user cur com.example.app
# Now shows verification timestamp, failure reason, and retry status

Credential Manager Integration

Android 14 introduced the Credential Manager API, which unifies passkeys, passwords, and federated sign-in. This intersects with deep linking when:

  • A deep link triggers a sign-in flow (e.g., a magic link email).
  • The app needs to authenticate the user before showing deep-linked content.
  • A referral deep link requires account creation.

The Credential Manager simplifies the sign-in step, reducing friction in deep link flows that require authentication:

// Use Credential Manager for deep link sign-in flows
suspend fun handleDeepLinkWithAuth(uri: Uri) {
    val credentialManager = CredentialManager.create(context)

    try {
        val result = credentialManager.getCredential(
            context,
            GetCredentialRequest(listOf(GetPasswordOption()))
        )
        // User authenticated; proceed with deep link content
        navigateToContent(uri)
    } catch (e: NoCredentialException) {
        // No saved credentials; show sign-up flow
        navigateToSignUp(uri)
    }
}

Predictive Back Gesture

Android 14 expanded the predictive back gesture API. When a user opens your app via a deep link and then swipes back, the predictive back animation should show where they'll go (the previous app, not a blank screen).

For deep link Activities, handle the back gesture correctly:

class DeepLinkActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Enable predictive back
        onBackPressedDispatcher.addCallback(this) {
            // If this was opened from another app via deep link,
            // finish() returns to the calling app
            finish()
        }
    }
}

Partial Screen Sharing

Android 14 allows partial screen sharing. Users can share a single app window instead of the entire screen. This doesn't directly change deep link behavior, but it's worth noting: if your app generates shareable content with deep links embedded (QR codes, share cards), the content should be within the app window, not in system overlays.

Migration Checklist

Targeting API 33 (Android 13)

  • All Activities that receive deep links have matching intent filters
  • Notification permission requested before sending referral/deep link notifications
  • Per-app language preferences respected in deep link content screens
  • Share flows work correctly with Photo Picker (no reliance on image metadata for attribution)

Targeting API 34 (Android 14)

  • No implicit intents sent to internal components for deep link routing
  • All exported receivers have intent filters
  • Back gesture handling works correctly for deep link Activities
  • Credential Manager integrated for deep link sign-in flows (if applicable)
  • Test App Links verification on Android 14 devices

Testing Across Android Versions

Deep link behavior varies enough across Android versions that you should test on at least:

Android Version Key Behavior to Test
Android 11 (API 30) Package visibility restrictions
Android 12 (API 31) Mandatory App Link verification, web intent changes
Android 13 (API 33) Stricter intent filter matching, notification permissions
Android 14 (API 34) Implicit intent restrictions, improved verification

Use the Android Emulator to test across versions without physical devices. For App Links verification testing, use a physical device or an emulator with Google Play services.

For Tolinku deep links, the platform's redirect chain is compatible with all Android versions. The App Links verification file is served at the correct path with the right content type, which resolves many of the verification issues that the newer Android versions are stricter about. Configure your Android settings in the Tolinku dashboard to get started.

For the complete intent filter configuration guide, see the Android intent filters guide.

Get deep linking tips in your inbox

One email per week. No spam.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.