【问题标题】:Handling deeplinks with multiple activities处理具有多个活动的深层链接
【发布时间】:2021-09-21 13:56:28
【问题描述】:

我的应用程序中有两个不同的活动。

<activity
    android:name=".ui.login.LoginActivity">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="mysite.ua"
            android:pathPattern="/.*/confirm-email-for-app"
            android:scheme="https" />
        <data
            android:host="mysite.ua"
            android:pathPattern="/.*/confirm-email-forgot-pwd-app"
            android:scheme="https" />
    </intent-filter>

</activity>

<activity
    android:name=".ui.main.MainActivity">

    <intent-filter>

        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="mysite.ua"
            android:scheme="https" />

    </intent-filter>
</activity>

所以,我想要实现的是直接在 LoginActivity 中处理具有在 LoginActivity 的意图过滤器中概述的模式的深层链接,并且所有其他不符合 otlined 模式的链接都在 MainActivity 中打开。

现在所有不符合模式的链接都可以在 MainActivity 中正确打开。但是当我尝试打开链接https://mysite.ua/ua/confirm-email-for-app 时,系统会显示带有两个应用程序实例的对话框。其中一个通向 LoginActivity,另一个通向 MainActivity。

我怎样才能避免这种情况?

我无法在 MainActivity 的意图过滤器中定义所有路径模式,因为我的目标是打开 MainActivity 中概述的主机的所有链接(适合 LoginActivity 模式的链接除外)。

【问题讨论】:

    标签: android android-intent android-activity deep-linking intentfilter


    【解决方案1】:

                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
    
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
    
                    <data
                        android:host="mysite.ua"
                        android:pathPattern="/.*/confirm-email-for-app"
                        android:scheme="https" />
                    <data
                        android:host="mysite.ua"
                        android:pathPattern="/.*/confirm-email-forgot-pwd-app"
                        android:scheme="https" />
    
                    <data
                        android:host="mysite.ua"
                        android:scheme="https" />
                </intent-filter>
    
            </activity>
    
            <activity
                android:name=".ui.main.MainActivity">
            </activity>
    

    在 LoginActivity 中,在查询参数中获取动态数据并根据您的条件进行重定向。

    下面是获取动态链接传入数据的代码

    FirebaseDynamicLinks.getInstance()
                .getDynamicLink(getIntent())
                .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                    @Override
                    public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                        // Get deep link from result (may be null if no link is found)
                        Uri deepLink = null;
                        if (pendingDynamicLinkData != null) {
                            deepLink = pendingDynamicLinkData.getLink();
                            Log.e(TAG, "onSuccess: check deep link url " + deepLink.toString());
    
                            String path = deepLink.getPath();
                            code = path.substring(path.lastIndexOf('/') + 1);
                            //check your condition and redirect according to that.
                           
                        }
                    }
                })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "getDynamicLink:onFailure", e);
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2023-02-14
      相关资源
      最近更新 更多