第 9 章摘要。 特定于平台的 API 调用
注意
本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。
有时需要运行一些因平台而异的代码。 本章将探讨这些方法。
共享资产项目中的预处理
Xamarin.Forms 共享资产项目可使用 C# 预处理器指令(#if
、#elif
和 endif
)为各个平台执行不同的代码。 PlatInfoSap1 中对此进行了演示:
但是,结果代码可能比较乱且难以阅读。
共享资产项目中的并行类
PlatInfoSap2 示例中演示了一种更加结构化的方法,用于在 SAP 中执行特定于平台的代码。 每个平台项目都包含同名的类和方法,但都是针对特定平台实现的。 然后,SAP 只需实例化该类并调用该方法。
DependencyService 和可移植类库
注意
可移植类库已替换为 .NET Standard 库。 书中的所有示例代码都已转换为使用 .NET Standard 库。
库通常不能访问应用程序项目中的类。 此限制似乎会阻止在库中使用 PlatInfoSap2 中显示的方法。 不过,Xamarin.Forms 包含一个名为 DependencyService
的类,该类使用 .NET 反射从库中访问应用程序项目中的公共类。
库必须定义一个 interface
,其中包含需要在每个平台中使用的成员。 然后,每个平台都要包含该接口的实现。 用于实现接口的类必须在程序集级别使用 DependencyAttribute 进行标识。
然后,库使用 DependencyService
的泛型 Get
方法获取用户实现该接口的平台类的实例。
DisplayPlatformInfo 示例对此进行了演示。
特定于平台的声音生成
MonkeyTapWithSound 示例通过访问每个平台中的声音生成功能,将蜂鸣声添加到 MonkeyTap 程序中。