Android 即时应用程序和应用程序链接的使用

Android Instant Apps and use of App LInks

Android 即时应用似乎在 Android 5.0 或更高版本中受支持。但是,App Links(据我所知,Instant Apps 依赖于它)仅在 6.0 或更高版本中受支持。我在网上搜索过,但找不到明确的答案。

一般来说,我们想要支持即时应用程序,使用应用程序链接在不同功能模块中的活动之间导航,但在大多数情况下还需要使用这些模块来构建可在其上运行的可安装 apk低于 5.0
的版本 这是否意味着代码需要检查 API 级别并根据版本使用不同的方法(例如,如果 < 5.0,则明确调用 startActivity)?

这是我在 Instant Apps documentation:

中找到的信息

Both your instant and installable versions of your app must implement the Android App Links feature introduced in Android 6.0. App Links provide the primary mechanism for connecting URLs to discrete activities within your app.

an instant app cannot launch an activity in another feature directly; instead, it must request the URL address that corresponds to the other other feature's entry-point activity.

然后从https://developer.android.com/topic/instant-apps/index.html

Android Instant Apps supports the latest Android devices from Android 5.0 (API level 21) through Android O

Android 应用程序链接只是为 Android 系统提供了一种将您的 http deep-links 与您的应用程序唯一关联的方法(不显示消歧对话框供用户 select 打开哪个应用 link)。它不会给你任何新的 API 来启动 activity。因此在任何情况下您都需要调用 startActivity。如果你想打开属于另一个 Instant App 功能模块的 activity,你只需要使用隐式意图。

对于同一功能模块内部的导航(或者如果您的 Instant App 仅包含 one base feature),可以自由使用显式意图。

It looks like right now that Android Instant Apps are supported in Android 5.0 or later. However, App Links (which I understood that Instant Apps depend on) are only supported in 6.0 or later

是的,没错。但是 Instant App supervisor(由 Google Play Services 内部安装并用于 运行 Instant Apps on Android before 8.0)将确保应用程序 link 注册到您经过验证的 Instant App 域将直接转发到您的 Instant App。

Does this mean that code needs to check the API level and use different approaches depending on version (e.g calling startActivity if < 5.0)

是的,如果您想 100% 确定您的用户在浏览应用程序的活动(以及大多数可能您想防止这种奇怪的用户体验)。如果你使用依赖注入,你可以在你的应用程序中使用一个用于导航的界面,然后为可安装应用程序和即时应用程序提供不同的实现。

interface Navigation {
   void startActivityFromModuleA();
   void startActivityFromModuleB();
   …
}

class InstallableAppNavigation implements Navigation {
   public void startActivityFromModuleA() {
       // explicit intent
       Intent intent = new Intent(context, ActivityFromModuleA.class);
       context.startActivity(intent);
   }
   …
}

class InstantAppNavigation implements Navigation {
   public void startActivityFromModuleA() {
       // implicit intent
       Intent intent = new Intent(Intent.ACTION_VIEW,  
               Uri.parse("https://your.app.com/moduleA/smth"));
       context.startActivity(intent);
   }
   …
}