我在 Android Market 中注意到,许多流行的应用程序都向后兼容更早版本的 Android。 例如
Evernote - 1.6
Faceobook Messenger - 2.2
这些应用程序看起来和工作起来都很棒,但它们如何做到这一点并支持更旧的 API 级别?他们是否几乎只使用支持的最低操作系统版本中存在的 API 功能?我假设他们必须使用更高版本 API 级别的某些功能来提供出色的 UI 和功能列表。
我可以看到两种可能的解决方案:
在构建中使用最小/目标 API 级别。然后通过代码检查操作系统版本并使用受支持的方法实现功能并优雅地降级。这看起来工作量很大。
拥有针对不同操作系统版本的多个应用程序版本。例如。 2.2 的一个版本和 4.0 的另一个版本。这可能吗?
询问的原因是我正在计划一个应该支持 2.2 的新应用程序,但我担心我可能需要仅在更高版本中可用的 API 功能?我应该只针对 2.2 吗?
编辑:另外,兼容性库扮演什么角色?这是关键吗?
谢谢。
最佳答案
我们 (Evernote) 做了额外的工作来支持 1.6 并尽可能多地使用新的 API。支持 1.6 的主要问题是 Dalvik 对您的类进行贪婪搜索。这使得无法使用像
这样的代码if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
prefEditor.apply();
} else {
prefEditor.commit();
}
因为它会抛出类验证错误。这是在 dalvik 看到您的方法并尝试在运行时访问它时引起的。
相反,您需要使用辅助类来为 SDK 实例化适当的类。是的,这是更多的工作
public abstract class SharedPreferenceEditor {
private static SharedPreferenceEditor sInstance;
public static SharedPreferenceEditor getInstance() {
if (sInstance == null) {
/*
* Check the version of the SDK we are running on. Choose an
* implementation class designed for that version of the SDK.
*/
@SuppressWarnings("deprecation")
int sdkVersion = Build.VERSION.SDK_INT;
if(Evernote.DEBUG)Log.d("SharedPreferenceEditor", "sdkVersion=" + sdkVersion);
if (sdkVersion < Build.VERSION_CODES.GINGERBREAD) {
sInstance = new CommitSharedPreferenceEditor();
} else {
sInstance = new ApplySharedPreferenceEditor();
}
}
return sInstance;
}
public abstract void save(SharedPreferences.Editor editor);
}
然后你有 Gingerbread + api 级别的一个
public class ApplySharedPreferenceEditor extends SharedPreferenceEditor {
public void save(SharedPreferences.Editor editor) {
editor.apply();
}
}
还有一个是< Gingerbread 关卡
public class CommitSharedPreferenceEditor extends SharedPreferenceEditor{
public void save(SharedPreferences.Editor editor) {
editor.commit();
}
}
我建议支持 2.1 及更高版本,这样您就可以利用对 Dalvik 的改进并使用我列出的第一个示例。
关于Android 向后兼容,但仍使用最新的 API 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272397/