分支 onInitFinished 回调在网络不可访问时调用两次



我有空的 Splash 活动作为 Android 应用程序的入口点,并在收到 Branch 数据时调用适当的活动。

如果出现分支回调错误或丢失或无法识别的数据,它将调用默认的 Main 活动。

如果设备具有互联网连接,则一切正常,但是如果发生故障onInitFinished回调将连续调用两次(一次为空数据集,一次触发错误),两次调用 Main 活动。

public class SplashActivity extends AppCompatActivity
{
Branch.BranchReferralInitListener branchCallback;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_activity);
Log.d("XAPP", "Splash");
branchCallback = new Branch.BranchReferralInitListener()
{
@Override
public void onInitFinished(JSONObject referringParams, BranchError error)
{
Log.d("XAPP", "Branch init session");
if (error == null)
{
Log.d("XAPP", referringParams.toString());
// run different activities depending on the parameters
....
else
{
// fallback to Main activity
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
} 
}
else
{
Log.i("XAPP", error.getMessage());
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
}
finish();
}
};
}
@Override
protected void onStart()
{
super.onStart();
Log.d("XAPP", "onStart");
Branch branch = Branch.getInstance();
branch.initSession(branchCallback);
}
}

当应用程序在没有连接到互联网的情况下运行时(在某个时候通过 Branch 深层链接打开并且 Branch 数据已初始化之后)时生成的 logcat:

D/XAPP: Splash
D/XAPP: onStart
D/XAPP: Branch init session
D/XAPP: {"+is_first_session":false,"+clicked_branch_link":false}
D/XAPP: Branch init session
I/XAPP: Trouble initializing Branch.  Branch API Error: poor network connectivity. Please try again later.

飞溅活动声明为singleTask活动,并且仅启动一次。

Android清单的相关部分:

<uses-permission android:name="android.permission.INTERNET"/>
...
<activity
android:name=".SplashActivity"
android:launchMode="singleTask"
android:label="@string/app_name"
android:theme="@style/AppTheme.FullScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- Branch URI Scheme -->
<intent-filter>
<data android:host="open" android:scheme="xxxx"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.FullScreen">
</activity>

Gradle的相关部分:

android {
compileSdkVersion 26
buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 15
targetSdkVersion 26
...
dependencies {
compile('io.branch.sdk.android:library:2.14.4') {
exclude module: 'answers-shim'
}

我可以通过使 Main 活动singleTask或完全删除 Splash 活动来解决此问题 - 通过将分支移动到 Main 活动,但在这种特殊情况下,这些解决方案不是可行的选择。

可能的解决方案之一是添加一些布尔标志来识别已经调用onInitFinished,但如果可能的话,我想避免那个。

在这种情况下,我主要关心的不是如何破解它以使其工作,而是为什么onInitFinished调用两次并且我的 Branch 回调实现是否存在缺陷?

我在示例应用程序中用您的SplashActivity进行了测试,回调只触发了一次。

这是我的回购。

请使用此应用程序进行测试以检查是否可以复制该行为

为了编译应用程序: 1. 将 URI 方案从分支仪表板添加到 Android 清单 2. 将应用的分支密钥添加到清单 3. 将链接域添加到清单中的应用链接筛选器。

另外,我建议将分支SDK升级到最新版本,即2.14.4.

如果您的实现略有不同,您能否在此处共享您的清单文件。如果没有,您也可以写integrations@branch.io团队可以有效地帮助您。

需要单任务启动模式!

这样做的原因是,如果系统中还没有单个任务活动实例,则会创建一个新实例,并简单地将其放置在同一任务中的堆栈顶部。如果按原样使用单任务模式,则不应重新启动整个应用。仅当主/启动活动在活动堆栈中不存在时,单任务模式才会实例化该活动。如果活动存在于后台,则活动的每个后续意图都会将其置于前台。

最新更新