Android 8.0(API 26)如何替代实现com.android.vending.INSTALL_REFERRER功能?
针对Android 8.0(API 26)及更高版本的后台执行限制,原来通过清单注册隐式广播接收器来接收com.android.vending.INSTALL_REFERRER的方式确实行不通了。这里有几个靠谱的替代方案,都是官方推荐或者行业常用的:
1. 官方首选:Google Play Install Referrer API
这是Google官方推出的替代方案,稳定性和可靠性最高,不仅能获取归因数据,还不受后台广播限制的影响,甚至能拿到比传统广播更多的细节(比如点击时间、安装时间)。
实现步骤:
- 先在Module级别的
build.gradle中添加依赖:
dependencies { implementation 'com.android.installreferrer:installreferrer:2.2' }
- 初始化客户端并发起请求(建议在应用启动时调用,比如
Application的onCreate方法里):
InstallReferrerClient referrerClient = InstallReferrerClient.newBuilder(context).build(); referrerClient.startConnection(new InstallReferrerStateListener() { @Override public void onInstallReferrerSetupFinished(int responseCode) { switch (responseCode) { case InstallReferrerClient.InstallReferrerResponse.OK: // 连接成功,获取归因数据 try { ReferrerDetails response = referrerClient.getInstallReferrer(); String referrerUrl = response.getInstallReferrer(); long referrerClickTime = response.getReferrerClickTimestampSeconds(); long appInstallTime = response.getInstallBeginTimestampSeconds(); // 把获取到的信息上报到服务器或分析平台 } catch (RemoteException e) { e.printStackTrace(); } // 记得用完后断开连接 referrerClient.endConnection(); break; case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED: // 设备不支持该API,比如Google Play服务版本太低 break; case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE: // 连接失败,可以稍后重试 break; } } @Override public void onInstallReferrerServiceDisconnected() { // 连接断开,可尝试重新初始化连接 } });
2. 集成第三方归因SDK
如果你用的是Adjust、AppsFlyer、Branch这类成熟的第三方归因平台,它们已经完全适配了Android 8.0+的限制,直接集成它们的SDK就能自动处理归因逻辑,不用自己写原生代码。
这些SDK不仅封装了Install Referrer API的调用,还能提供渠道追踪、用户行为分析等额外功能,适合有复杂归因需求的应用。
3. 动态注册显式广播接收器(仅特殊场景)
这种方式可靠性不如前两种,但如果你的应用有特殊需求可以尝试:因为Android 8.0允许动态注册的广播接收器接收隐式广播(只要应用处于前台或启动状态)。你可以在应用启动时动态注册接收器:
// 在Activity的onCreate或者Application的onCreate中注册 IntentFilter filter = new IntentFilter("com.android.vending.INSTALL_REFERRER"); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String referrer = intent.getStringExtra("referrer"); // 处理拿到的referrer信息 } }, filter);
⚠️ 注意:如果应用安装后从未启动过,这个广播会无法被接收,所以这种方式只能作为补充,不能替代前两种方案。
补充说明:Google Play的
com.android.vending.INSTALL_REFERRERIntent会在应用从Google Play商店安装时发送广播,但Android 8.0的后台执行限制禁止了清单中注册的隐式广播接收器,所以上述方案都是绕开该限制的可行路径。
内容的提问来源于stack exchange,提问作者Krishna Sharma

