Использование отражения Java против проверки Build.VERSION.SDK_INT - PullRequest
2 голосов
/ 07 октября 2011

Зачем мне беспокоиться об использовании отражения, как обсуждалось здесь , если я могу просто протестировать версию Android из Build.VERSION.SDK_INT и условно запустить функции, недоступные в более низких версиях API?

В статье обсуждалось, как получить идентификатор метода, обработать исключения и т. Д., Что кажется более сложным, чем простое использование:

if(Build.VERSION.SDK_INT>=11){
    // some Honeycomb code
    // example: findViewById(R.id.root).setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
}

Этот код прекрасно работает на разных устройствах (2.2 / 3.2 / и т. Д.).

Спасибо

1 Ответ

0 голосов
/ 07 октября 2011

Ваше предложение не будет работать (без отражения) при работе в более старой системе Android, если код, скрытый в "// некотором коде сота", использует имена классов или методов, которые существуют только в API сота.Корень проблемы в том, что все классы, на которые есть ссылки из кода, загружаются при загрузке класса.Необходимо использовать отражение, чтобы отложить разрешение кода, содержащего ссылки на соты, до времени выполнения.

В частности, если у вас есть класс:

class MyUseOfFeatures {
   public void doSomething() {
       if (TestIfPhoneHasFancyHoneycombFeature()) {
          Object example = android.util.JsonReader(); // JsonReader is new in 3.0
       }
}

Затем, когда JVM (например, DVM)?) загружает байт-код для этого класса, он попытается разрешить имя android.util.JsonReader при загрузке класса (предположительно при загрузке приложения).

Если вы полагаетесь только на какое-то поведение Honeycomb (а не на какие-либо новые классы, методы или поля), тогда можно проверить только номер сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...