Ответ 1
Похоже, это работает благодаря компилятору JIT. Этот код выходит из строя на SDK < 2.1, который поддерживает эту теорию. Несмотря на это, это, вероятно, не является надежным способом избежать отражения.
Запуск следующего (note: target > 3.0)
ActionBar actionBar = getActionBar();
на Android с версией < 3.0 (SDK 11) приводит к NoSuchMethodError
.
Существует несколько способов обойти это, включая отражение и ленивую загрузку классов. Однако, похоже, что работает на всех тестируемых устройствах (2.3.6, 3.0, 3.1, 4.0):
boolean hasActionBar = android.os.Build.VERSION.SDK_INT >= 11;
if (hasActionBar) {
ActionBar actionBar = getActionBar();
} else {
// create custom actionbar
}
Обратите внимание, что параметр SDK_INT
равен static final
, что, по-видимому, является причиной этого.
Является ли это допустимым способом решения проблемы совместимости?
Похоже, это работает благодаря компилятору JIT. Этот код выходит из строя на SDK < 2.1, который поддерживает эту теорию. Несмотря на это, это, вероятно, не является надежным способом избежать отражения.
Я так считаю, пока все правильно настроено.
Из блога Reto Meier: http://blog.radioactiveyak.com/2011/02/strategies-for-honeycomb-and-backwards.html