我目前正在研究一个Android项目并遇到了问题,我想使用一种需要比我的最低级别更高的API的方法。 现在,我想要做的就是实现该方法,以便只有支持它的设备才会调用该方法。
实现这一目标的最简洁方法是什么。我看到有些人使用这样的if-else语句:
if(android.os.Build.VERSION.SDK_INT >= 14) {
// Do something fancy
} else {
// Do something regular
}
但对我而言,这看起来不是很“审美”。这是这样做的吗?谢谢!
答案 0 :(得分:0)
是的,这几乎就是它,但是如果if else
条件失控,你可以将这个逻辑压缩到一个地方。如果您正在使用依赖注入(DI),那么'模块'(参见DI项目中的@Module
定义,例如Square 'Dagger')将是您可以编写此类语句的地方;
@Provide @MyActivity Class<? extends Activity> provideMyActivityClass() {
if (Build.VERSION.SDK_INT >= 14) {
return MyActivitySupportingApiLevel14.class;
} else {
return MyCompatibilityActivity.class;
}
}
这种方法需要一些DI的知识,但总的来说;提供者方法意味着您的代码可以有一个单独的执行路径(即让我获得操作系统应该实例化的活动的类),并且您选择的DI框架将使用提供者下的指令来确定构建应用程序的正确活动是什么正在运行。这可能会在代码中引入一定程度的重复,但是有很多方法可以最大限度地减少这种情况,包括继承(每个人都知道继承是坏的吗?)以及DI对不同实现的进一步使用依赖于你的活动应该被建模为接口。您的实例化代码将如下所示;
@Inject @MyActivity Class<Activity> myActivity;
... // and later...
Intent intent = new Intent(this, myActivity);
startActivity(intent);
如果您没有时间启动并运行DI(以及Android上的DI),那么使用factory pattern可以获得类似的结果。
我们的应用在Android客户端使用Square的Dagger,在Java服务器端组件使用Guice。两篇文章都涉及相同的章节。