Android 深度链接打开错误的应用程序(即时应用程序,未安装应用程序)

Android 深度链接打开错误的应用程序(即时应用程序,未安装应用程序),android,android-instant-apps,android-app-bundle,android-deep-link,Android,Android Instant Apps,Android App Bundle,Android Deep Link,当我有一个即时应用程序和一个已安装的应用程序(版本)时,我遇到了一个深层链接问题。我的设置如下: 基本应用程序(com.android.application) 已安装的应用程序(com.android.dynamic-feature,dist:instant=“false”,dist:onDemand=“false”) Manifest.xml: <application> <activity android:name=".Activity1&

当我有一个即时应用程序和一个已安装的应用程序(版本)时,我遇到了一个深层链接问题。我的设置如下:

  • 基本应用程序(com.android.application)
  • 已安装的应用程序(com.android.dynamic-feature,dist:instant=“false”,dist:onDemand=“false”)
Manifest.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>
      ...
<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>
      ...

...
  • 即时应用程序(com.android.dynamic-feature,dist:Instant=“true”,dist:onDemand=“false”)
Manifest.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>
      ...
<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会足够聪明,可以使用安装的应用程序的活动来启动应用程序,如果它出现在设备上的话

所以我的问题是:你如何在安装的应用程序和即时应用程序中同时支持相同的深度链接?换句话说:如果未安装应用程序,请使用即时应用程序的活动(Activity2)打开深度链接;如果已安装应用程序,请使用已安装应用程序的活动(Activity1)打开深度链接


谢谢你的帮助

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

即时启用的模块不需要与已安装的模块有所不同,尤其是在具有相同入口点的情况下。Instant或installed对用户来说是不透明的,因此他们不会期望出现完全不同的行为


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

以防其他人出现此问题:

事实证明,这与意图过滤器无关。相反,在Android Studio的运行配置中,在“安装选项”中,您需要选择“来自应用程序包的APK”,而不是“默认APK”(默认选择)。完成此操作后,将启动正确的动态功能


谢谢你的回答,键盘冲浪者。即时启用的模块实际上与已安装的模块没有区别。他们俩都不了解对方。它们只是具有相同的目的过滤器。这个想法是,如果用户点击一个链接,而安装的模块不存在,即时应用程序就会启动,如果存在,安装的应用程序就会启动。