2017-10-14 86 views
4

现在看起来,Android即时应用程序在Android 5.0或更高版本中受支持。但是,应用链接(我了解Instant App依赖)仅在6.0或更高版本中受支持。我在网上搜索,但无法找到明确的答案。Android即时应用和使用应用程序专用接口

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

这是我在Instant Apps documentation中发现的信息:

无论您的即时和您的应用程序的安装版本必须实现 Android应用程序链接功能,在的Android 6.0介绍。应用链接 提供了将URL连接到应用内离散的 活动的主要机制。

即时应用程序无法启动直接另一个特点的活动;相反,它必须请求与其他功能的其他入口点活动对应的URL地址。

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

Android的即时应用支持从 的Android 5.0(API 21级)通过的Androidö

+0

乍一看,它看起来像你的帖子本身实际上缺乏问题。好吧,我在重读之后创建了它 - 敬请关注asnwer :) – Idolon

+0

是的,这有点漫不经心,我​​承认:)并且是2种相关的问题,以增加额外的混淆(将尝试和改述)! –

回答

3

Android应用链接只是提供一个最新的Android装置让Android系统将您的http深层链接与您的应用程序唯一关联(无需显示消除歧义对话框以供用户选择要打开链接的应用程序)。它不会给你任何新的API来启动一项活动。因此在任何情况下您都需要拨打startActivity。如果要打开属于另一个即时应用程序功能模块的活动,只需使用隐式意图。

对于同一功能模块内部的导航(或者如果您的即时应用只包含one base feature),可以自由使用明确的意图。

现在看起来像Android即时应用在 Android 5.0或更高版本中受支持。然而,应用链接(我知道 即时应用程序依赖于)仅支持6.0或更高版本

是的,的确如此。但即时应用程序主管(由Google Play服务内部安装,用于在8.0之前的Android上运行Instant App)将确保注册到已验证的即时应用程序域的应用程序链接将直接转发到您的即时应用程序。

这是否意味着代码需要检查API级别和使用取决于版本 不同的方法(如呼叫startActivity 如果< 5.0)

是的,如果你想成为100%确定您的用户将不会在您的应用程序的活动(并且很可能希望防止这种奇怪的用户体验)之间浏览时显示消歧义(又名“选择器”)对话框like this。如果您使用依赖注入,则可以在应用中使用用于导航的界面,然后为可安装应用和即时应用提供不同的实现。

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); 
    } 
    … 
} 
+1

关于使用显式意图的一件事情......它将需要一定程度的耦合,否则将不需要(例如导航代码在基本模块中)。你有避免这种情况的建议吗? –

+1

@ JohnO'Reilly当然,避免耦合最简单的方法是使用ComponentName而不是类引用。另一种选择是使用隐含的意图,但以包名称开始的操作(例如'com.yourapp.ACTION_A') - 这可以最大限度地降低意外选择器对话框弹出的风险。如果你想有一个更合适的OOP解决方案,我建议查看[Dagger multibindings](https://google.github.io/dagger/multibindings)。 (一个想法是将导航委托给一些接口实例,这些接口实例由功能模块的组件添加到多重绑定映射中。) – Idolon

+0

您是否将实现分别放入instant和apk模块中? – dazza5000

相关问题