我很困惑应用程序在不同Android版本上启动时的行为方式。
假设我正在使用SDK级别4进行编译。是否在代码中进行了编译,并且在使用SDK 10的手机上运行时仍将使用旧的SDK 4,否则它将使用SDK 10?
一个简单的例子是Service的setForeground()
- 方法,该方法已被弃用。如果我在带有SDK 10的手机上运行此类代码,该功能是否会起作用,或者它将使用SDK 4中的版本?
onStart()
被弃用也是如此。它是否会在SDK 10上被忽略,它将尝试调用onStartCommand()
?
如果有人能解释我将会发生什么以及为什么会这样做,我会感激不尽。
答案 0 :(得分:4)
是否在代码中进行了编译,在使用SDK 10的手机上运行时仍然会使用旧的SDK 4,还是会使用SDK 10?
SDK意味着软件开发工具包,因此设备不会使用SDK运行任何内容。另一方面,设备具有属于特定API的不同类型的OS。
如果您运行使用SDK 4编译的版本,并在运行API 10的设备中运行它,它将使用新API(称为向后兼容性)运行它。
通常,较新版本的SDK支持不推荐使用的功能。他们中的大多数都可以使用,但你必须尝试不使用它们。当然,在某些情况下,您无法选择,例如,当您使用的方法已被弃用但在您使用的旧SDK中没有替换时。
答案 1 :(得分:2)
您的服务只是编译的字节码 - 具有自己的类和对其他类和方法的引用。当它部署在较新的Android版本上时,它(android,OS)会做任何它认为合适的事情 - 你没有影响力。与其他基于java的系统一样,它将依赖于正确的类名/包/接口,并尝试使用某些签名(参数和返回值)来解析方法。如果它在社交方面表现,它将首先检查是否有来自较新接口的方法(即onStartCommand()),如果它是可用的,它将被调用。然后它可能(或不)回退到旧方法。但通常你可以依赖反向兼容性保持相当长的时间。
答案 2 :(得分:2)
大多数手机上大多数已弃用的api通话都能正常工作...... 但是,由于开发人员滥用它(在不通知用户的情况下将服务设置到前台)这一点,已经删除了一些像setForeground()的给定示例。所以他们不会工作。 不幸的是,没有哪些文档可以支持,哪些不支持,这是一个反复试验的事情......
此外,由于某种原因,不同的实施(手机制造商/型号)之间存在差异。 一个很好的例子是旧的Contacts APi(pre V2.0),它可以在一些较新的Android 2.2 / 2.3手机上运行,但在其他具有相同操作系统版本的手机上无效... 最好的选择是不要使用弃用的方法,并根据Android OS版本的当前流行度进行调整(目前2.1,2.2,2.3.2,2.3.3是流行的版本:http://developer.android.com/resources/dashboard/platform-versions.html)。< / p>