如果网络不可访问,则分支onInitFinished回调调用两次

时间:2018-01-08 23:59:42

标签: android branch.io

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

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

如果设备具有Internet连接,则一切正常,但是如果失败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);
    }
}

当应用程序在没有连接到Internet的情况下运行时产生的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.

Splash活动声明为singleTask个活动,仅启动一次。

AndroidManifest的相关部分:

<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'
    }

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

其中一个可能的解决方案也是添加一些布尔标志来识别已经被调用的onInitFinished,但我想尽可能避免使用它。

我在这种情况下的主要关注点和实际问题不是如何破解使其正常工作,但为什么onInitFinished被调用两次并且我的分支回调中存在缺陷执行?

2 个答案:

答案 0 :(得分:0)

我在示例应用中使用您的SplashActivity进行了测试,并且回调仅被触发一次。

这是我的repo

请使用此应用测试以检查您是否可以复制行为

为了编译应用程序: 1.将分支仪表板中的URI方案添加到Android Manifest 2.将应用程序的分支键添加到Manifest 3.将您的链接域添加到Manifest中的应用程序链接过滤器。

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

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

答案 1 :(得分:-1)

需要单一任务启动模式!

原因是因为如果系统中还没有singleTask Activity实例,则会创建一个新实例,并将其简单地放在同一Task中的堆栈顶部。如果您按原样使用“单任务”模式,则不应重新启动整个应用程序。仅当活动堆栈中不存在Main / Splash Activity时,Single Task模式才会实例化它。如果活动存在于后台,则活动的每个后续意图都会将其带到前台。