Android. Устройства и API

У меня есть приложение, которое ведет себя по-разному, когда компилируется для API 18 и 19 (поведение повторения тревоги).

Я скомпилировал приложение для API 19 (API Google). Я запустил его на устройстве и увидел, что Build.VERSION.SDK_INT вернул 16.

Я понимаю, что это говорит о том, что 16 – это максимальный номер API, который мое устройство может запускать в настоящее время.

Я просто хотел проверить: В таком случае мое приложение будет работать на таком устройстве, независимо от того, скомпилировано ли оно для API 18 или 19?

У меня есть приложение, которое ведет себя по-разному, когда компилируется для API 18 и 19 (поведение повторения тревоги).

Основное поведение AlarmManager не зависит от того, как вы скомпилируете приложение. Это зависит от уровня ОС устройства и, что более важно, вашего android:targetSdkVersion .

Единственная разница в AlarmManager основанная на том, как вы скомпилируете приложение (т. AlarmManager Цель сборки, Project> Properties> Android в Eclipse), заключается в том, есть ли у вас прямой доступ к дополнительным методам (например, setExact() ) на новых устройствах.

В таком случае приложение будет работать на таком устройстве, независимо от того, скомпилировано ли оно для API 18 или 19?

Это невозможно ответить абстрактно, даже если мы преобразуем «скомпилировали его» в «set android:targetSdkVersion ». Некоторые изменения поведения будут происходить на новых устройствах независимо от android:targetSdkVersion ; Некоторые изменения поведения будут происходить на более новых устройствах, только если ваш android:targetSdkVersion установлен на уровне API или выше.

В конкретном случае AlarmManager некоторые из них рассматриваются в JavaDocs для конкретного Build.VERSION_CODES значения Build.VERSION_CODES , такого как KITKAT :

AlarmManager.set интерпретируется как неточное значение, чтобы дать системе больше гибкости при планировании аварийных сигналов.

Это также отражено в документации для самого AlarmManager , например:

Приложения, чья targetSdkVersion ранее API 19 будет продолжать видеть предыдущее поведение, при котором все сигналы тревоги отправляются точно по запросу.

Target API! = Ваше устройство api

Например, если вы установите целевой API равным 16, вы можете получить доступ ко всем API с версией <= 16 Когда вы запускаете устройство с новым API, оно все равно будет работать, поскольку все общедоступные API должны быть обратно совместимы

Но в некоторых случаях целевой API изменяет поведение приложения. Например, веб-просмотр kitkat сильно изменился, какой-то старый код действительно конфликтует с kitkat api. Но чтобы сохранить обратную совместимость, он не сработает с целевым api <kitkat. Но если вы установите target api как kitkat, это означает, что вы знаете новые изменения api в kitkat, это сбой, если вы запустите этот старый проблемный код. Чтобы устройство со старым sdk работало, вам нужно будет проверить версию устройства sdk и запустить другой код в разных sdk.

Таким образом, для вашего случая, если вам нужен будильник, точно время, которое вы установили, вот код:

  if (Utils.isKitKatOrLater()) { am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } else { am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } 

Вы должны использовать эмуляторы …
Установите столько, сколько сможете, запустив устройства с разными версиями ОС.
Я знаю, что они медленные, но они неоценимую помощь.

Устройство работает на уровне API 16, потому что установлен Jelly Bean (версия 4.1 или версия 4.1.1).
Таким образом, он обратно совместим с minSdkVersion (как определено в вашем манифесте).

Ваш targetSdkVersion всегда должен быть последним.