0

在拥有免安装应用和已安装的应用(版本)时,我遇到了深层链接问题。我的设置如下:

  • 基础应用程序(com.android.application)
  • 已安装的应用程序(com.android.dynamic-feature with dist:instant="false", dist:onDemand="false")

清单.xml:

<application>
   <activity
      android:name=".Activity1">
      <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:scheme="https"
            android:host="example.com"
            android:pathPattern="/deeplink/*" />
      </intent-filter>
      ...
  • Instant App(com.android.dynamic-feature with dist:instant="true", dist:onDemand="false")

清单.xml:

<application>
   <activity
      android:name=".Activity2">
      <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:scheme="https"
            android:host="example.com"
            android:pathPattern="/deeplink/*" />
      </intent-filter>
      ...

(请注意,已安装应用的清单定义了 Activity1,而免安装应用的清单定义了 Activity2)

问题是,当我打开带有深层链接的已安装应用程序时,它会打开 Activity2(即时应用程序的活动)而不是已安装应用程序的活动。

我了解 gradle 对动态功能模块和将所有 3 个清单合并在一起的基本应用程序(基本应用程序、已安装应用程序、即时应用程序)进行清单合并。但我认为 android 会足够聪明,可以使用已安装应用程序的活动来启动应用程序(如果它存在于设备上)。

所以我的问题是:如何同时支持已安装应用和免安装应用中的相同深层链接?换句话说:如果没有安装应用,使用免安装应用的Activity(Activity2)打开深层链接,如果安装了应用,使用已安装应用的Activity(Activity1)打开深层链接?

谢谢你的帮助!

4

2 回答 2

1

以防万一其他人遇到这个问题:

事实证明,它与意图过滤器无关。相反,在 Android Studio 的运行配置中,您需要在“安装选项”中选择“应用包中的 APK”而不是“默认 APK”(这是默认选择)。一旦你这样做了,正确的动态特性就会被启动。

在此处输入图像描述

于 2020-11-18T18:56:13.380 回答
0

在您的示例意图过滤器中,您用于启动意图的数据侦听完全相同的 URL 模式。通常不鼓励这样做,因为您的 AndroidManifest 中只有一个条目能够从 Android 框架接收此意图。

即时启用的模块不需要区分已安装的模块,特别是如果它具有相同的入口点。Instant 或 installed 对用户来说是不透明的,因此他们不会期望出现截然不同的行为。

如果需要区分即时状态和安装状态,可以PackageManager.isInstantApp()根据返回值使用和执行不同的代码。

于 2020-11-18T10:00:20.647 回答