延迟深度链接让未安装您应用的用户可以点击 Adjust 链接,从应用商店安装应用,并在首次打开应用时直接跳转至其目标内容。
工作原理
以下是延迟深度链接的基本流程:
-
用户点击 Adjust 深度链接。
-
Adjust 服务器将用户重定向至应用商店。
-
用户安装或重装并打开应用。
-
Adjust SDK 向 Adjust 服务器发送 /session 和 /attribution 请求。
-
Adjust 服务器将匹配点击与安装/重装,并通过下列任一响应将延迟深度链接返回至 SDK:
/session 响应 (优化延迟深度链接)
/attribution 响应 (遗留行为)
Adjust SDK 会通过延迟深度链接监听器,向您的应用发送延迟深度链接。
-
如果适用,您的应用将显示其初始界面,例如新客户引导界面和用户登录界面。
-
您的应用处理深度链接,并导航至相应界面。
当用户点击 Adjust 品牌化链接 (brandname.go.link),且该链接被延迟时,Adjust 的服务器会使用在 Adjust 控制面板的 Android 平台设置中配置的应用 Scheme,将其转换为应用 Scheme 格式 (example://),然后传递给 Adjust SDK。
设置
设置延迟深度链接监听器
- 创建一个
AdjustConfig 对象。
- 在
AdjustConfig 对象上设置延迟深度链接监听器。Adjust SDK 收到延迟深度链接后会调用该监听器。
- 初始化 SDK。
val appToken = "{YourAppToken}"
val environment = AdjustConfig.ENVIRONMENT_SANDBOX
val config = AdjustConfig(this, appToken, environment)
config.setOnDeferredDeeplinkResponseListener { deeplink: Uri? ->
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link
* (for example, store it or handle it immediately)
false // or true based on your use case (see below)
String appToken = "{YourAppToken}";
String environment = AdjustConfig.ENVIRONMENT_SANDBOX;
AdjustConfig config = new AdjustConfig(this, appToken, environment);
config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() {
public boolean launchReceivedDeeplink(Uri deeplink) {
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link
* (for example, store it or handle it immediately)
return false; // or true based on your use case (see below)
返回值选项
延迟深度链接监听器返回的值决定了监听器代码执行后会发生什么:
返回 false (最常见)
如果希望您的应用对延迟深链接的处理时间和方式拥有完全控制权,请采用此方法。返回 false 时,Adjust SDK 不会尝试打开延迟深度链接。例如,如果您的应用需要在处理延迟深度链接之前显示并跳过初始界面 (如新客户引导或登录界面),则此方法十分适用。
返回 true
如果您希望 Adjust SDK 在监听器代码运行完毕后立即尝试打开延迟深度链接,请使用此方法。例如,如果您的应用没有任何初始界面,则此方法十分适用。
Adjust SDK 收到延迟深度链接后,您的监听器代码就会运行。随后, Adjust SDK 会使用延迟深度链接调用 startActivity(Intent) 。
完整代码示例
此示例展示了拥有新客户引导流程的应用如何处理延迟深度链接。
应用内部流程总结如下:
-
用户打开应用,延迟深度链接进入可用状态。
-
应用开始其新客户引导流程。
-
应用的监听器从 Adjust SDK 接收延迟深度链接,然后检查新客户引导是否完成:
- 如果已完成新客户引导,会立即处理深度链接。
- 如果未完成新客户引导,则会存储深度链接。
-
新客户引导完成后,应用会检查并处理所有已存储的延迟深度链接。
-
应用将用户引导至深度链接界面。
class MainActivity : AppCompatActivity() {
private lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedPreferences = getSharedPreferences("adjust_prefs", Context.MODE_PRIVATE)
val appToken = "{YourAppToken}"
val environment = if (BuildConfig.DEBUG) AdjustConfig.ENVIRONMENT_SANDBOX else AdjustConfig.ENVIRONMENT_PRODUCTION
val config = AdjustConfig(this, appToken, environment)
config.setLogLevel(if (BuildConfig.DEBUG) LogLevel.VERBOSE else LogLevel.SUPPRESS)
// Receive deferred deep link via listener
config.setOnDeferredDeeplinkResponseListener { deeplink: Uri? ->
return@setOnDeferredDeeplinkResponseListener false
val hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false)
if (hasCompletedOnboarding) {
// If onboarding is complete, handle deferred deep link immediately
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.
// Store deferred deep link to invoke after onboarding screens and login
.putString("deferred_link", deeplink.toString())
// The app controls when and how it handles the deferred deep link, so return false.
val hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false)
if (hasCompletedOnboarding) {
// Show onboarding screens and login prompt
// This logic runs when the user finishes the onboarding flow
fun onOnboardingFinished() {
// Set hasCompletedOnboarding to true
sharedPreferences.edit().putBoolean("has_completed_onboarding", true).apply()
// Check for deferred deep link received before or during onboarding
// Exit if no deferred deep link was stored
val deferredLinkString = sharedPreferences.getString("deferred_link", null) ?: return
// Remove the stored deep link to prevent it from being handled again
sharedPreferences.edit().remove("deferred_link").apply()
// Convert the stored string back to a Uri object
val deeplink = Uri.parse(deferredLinkString)
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.
public class MainActivity extends AppCompatActivity {
private SharedPreferences sharedPreferences;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPreferences = getSharedPreferences("adjust_prefs", Context.MODE_PRIVATE);
String appToken = "{YourAppToken}";
String environment = BuildConfig.DEBUG ? AdjustConfig.ENVIRONMENT_SANDBOX : AdjustConfig.ENVIRONMENT_PRODUCTION;
AdjustConfig config = new AdjustConfig(this, appToken, environment);
config.setLogLevel(BuildConfig.DEBUG ? LogLevel.VERBOSE : LogLevel.SUPPRESS);
// Receive deferred deep link via listener
config.setOnDeferredDeeplinkResponseListener(new OnDeferredDeeplinkResponseListener() {
public boolean launchReceivedDeeplink(Uri deeplink) {
boolean hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false);
if (hasCompletedOnboarding) {
// If onboarding is complete, handle deferred deep link immediately
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.
// Store deferred deep link to invoke after onboarding screens and login
.putString("deferred_link", deeplink.toString())
// The app controls when and how it handles the deferred deep link, so return false.
boolean hasCompletedOnboarding = sharedPreferences.getBoolean("has_completed_onboarding", false);
if (hasCompletedOnboarding) {
// Show onboarding screens and login prompt
// This logic runs when the user finishes the onboarding flow
private void onOnboardingFinished() {
// Set hasCompletedOnboarding to true
sharedPreferences.edit().putBoolean("has_completed_onboarding", true).apply();
// Check for deferred deep link received before or during onboarding
// Exit if no deferred deep link was stored
String deferredLinkString = sharedPreferences.getString("deferred_link", null);
if (deferredLinkString == null) {
// Remove the stored deep link to prevent it from being handled again
sharedPreferences.edit().remove("deferred_link").apply();
// Convert the stored string back to a Uri object
Uri deeplink = Uri.parse(deferredLinkString);
* example://summer-clothes?promo=beach&adj_t=def456
* TODO: Handle the deep link and navigate to the appropriate screen.