我正在尝试动态功能和Instant Apps。 要在各种功能之间导航,我使用“深层链接”。
每次我导航到另一个活动时,都会看到消歧对话框少于1秒,其中列出了1个应用程序。请注意,“ Once”和“ Always”(在荷兰语中)的选项是如何变灰的。
示例Github项目
我创建了一个minimalistic sample,它与我在Github上的当前结构相匹配。需要Android Studio 3.5-RC2
某些上下文:
我非常有信心,深层链接配置正确。但是既然你们还是想检查一下,这里是配置:
1-清单:
<activity
android:name=".ProfileActivity">
<intent-filter
android:autoVerify="true"
android:priority="100">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="giddy.entreco.nl"
android:pathPrefix="/profile"
android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
</activity>
2-资产链接 我的域包含可公开访问的assetlinks.json
3-莎的正确 我用的sha是正确的
Executing tasks: [signingReport] in project
SHA1: 3A:52:19:77:C1:AD:18:F4:98:21:77:74:37:DC:9B:89:02:64:6E:C6
SHA-256: 25:DD:C3:7B:8E:35:D3:39:D5:D4:6C:B5:EA:7D:14:AF:82:EC:9C:56:A6:F5:76:A3:E1:D7:69:B3:EC:58:72:E8
Valid until: Saturday, March 21, 2048
4-已确认的数字资产链接文件 所有支票均通过 https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://giddy.entreco.nl&relation=delegate_permission/common.handle_all_urls
5-测试网址意图 也可以!唯一的问题是我在短时间内看到了消歧对话框。
其他信息
我在所有模块中都使用apply plugin: 'com.android.dynamic-feature'
(当然,app
除外)
Android Studio:3.5 RC2; Android-gradle-plugin:3.5.0-rc02
我的设备是OnePlus6-具有Oxygen 9.0.7和Android 9
某些Samsung设备的行为不同。它没有显示“使用1消除歧义”选项,而是列出了我的应用两次,并将一直等待直到您选择Once
或“始终”。 (请注意,我是从Play商店的发布前报告中获得的)
无论我构建APK,应用程序捆绑包还是通过Google Play下载,我都能看到这种行为。总是一样。
有什么建议可以消除烦人的对话吗?
当我分析apk /捆绑包时,我确实看到了两个关于特定Activity
的条目。不仅在base module's manifest
中,而且在profile module's manifest
中。我对Android / PlayStore在安装模块时如何合并这些清单几乎一无所知,但我想在这种情况下查看对话框可能很有意义。
答案 0 :(得分:4)
是的...我相信我以前已经看过这种情况,当通过URL目的从一个动态功能(即时)导航到另一个动态(非即时)功能时,这是一种奇怪的行为。
在解决此问题之前,我不建议您使用URL意图在模块之间导航,相反,请使用反射直接进入其他模块的活动,例如:
if (doesModuleExist()) {
val intent = Intent()
.setClassName(getPackageName(), "com.sample.ProfileActivity")
.addCategory(Intent.CATEGORY_DEFAULT)
.addCategory(Intent.CATEGORY_BROWSABLE)
startActivity(intent)
}
doesModuleExist()
在以下位置检查是否存在:
检查您的清单清单,看来您的个人资料模块不是即时应用程序dist:instant="false"
的一部分,因此您将永远无法访问它,因此您只需执行isNotInstantApp()
请改为检查,并且永远不要尝试将其作为即时应用程序启动。
一次在您已安装的应用中,那么从技术上讲您无需检查,因为它始终为include="true"
,但是如果您的配置文件模块是onDemand模块,或者只是出于安全预防措施,则应使用splitInstallManager.getInstalledModules()
,请参见/app-bundle/playcore#manage_installed_modules (注意,您也可以在您的即时应用程序)
由于不同设备之间的奇怪行为有所不同,这可能意味着它们在拦截和处理URL意图方面实现了细微的差别,并且/或者它只是一个不同的Android版本(pre-O与O +)。
也可以,将common.handle_all_urls
的多个软件包名称与单个网站域名相关联时,当系统尝试在您的应用上线时尝试验证关联时,可能会导致一些其他行为。
答案 1 :(得分:1)
有一种可能的解决方案是将 URI 意图与动态功能结合使用,而不是切换到反射。您可以使用一个技巧,在运行时使用 packageManager.queryIntentActivities() 获取所需的类名,这样您就不必使用硬编码的活动名称。
以下扩展函数是如何将使用 URI 或深层链接的 Intent 转换为不显示选择器对话框的示例:
fun Intent.convertToSafeDynamicFeatureModuleIntent(context: Context) {
//Get list of all intent handlers for this Intent. This should only be the actual activity we are looking for
val options = context.packageManager.queryIntentActivities(this, PackageManager.MATCH_DEFAULT_ONLY)
//Set the activity that supported the given intent
setClassName(packageName, options[0].activityInfo.name)
}
然后你可以简单地做:
intent.convertToSafeDynamicFeatureModuleIntent(context)
startActivity(intent)
可以找到更长的解释here