Как вызвать «isInitialStickyBroadcast ()» и избежать проблем на 1.6? - PullRequest
1 голос
/ 10 января 2010

isInitialStickyBroadcast(), очевидно, доступен только после 2.0 (SDK 5).

Я получаю эту ошибку:

"Uncaught handler: выход из основного потока из-за необработанного исключения java.lang.VerifyError "

Это происходит только на 1.6. У Android 2.0 и выше проблем нет, но это главное.

Я не могу поймать ошибку / исключение (java.lang.VerifyError), и я знаю, что это вызвано вызовом isInitialStickyBroadcast (), который недоступен в SDK 4, поэтому он включен в проверку SDK.

Мне просто нужен этот BroadcastReceiver, чтобы он работал на 2.0+ и не ломался в 1.6, это приложение на рынке, функция UNDOCK необходима для пользователей на 2.0+, но, очевидно, не на 1.6, но есть довольно значительное число пользователей все еще на 1.6.

Вот легкая для чтения версия части кода, которую я использую. Обратите внимание, что он включен в проверку SDK для запуска только на 2.0+, но VerifyError все еще отображается.

private BroadcastReceiver mUndockedReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        //FROM ECLAIR FORWARD, BEFORE DONUT THIS INTENT WAS NOT IMPLEMENTED
        if (Build.VERSION.SDK_INT >= 5)
        {
            if (!isInitialStickyBroadcast()) {
                //Using constant instead of Intent.EXTRA_DOCK_STATE to avoid problems in older SDK versions
                int dockState = intent.getExtras().getInt("android.intent.extra.DOCK_STATE", 1);
                if (dockState == 0)
                {
                    finish();
                }
            }
        }
    }
}; 

1 Ответ

1 голос
/ 10 января 2010

Ваша проблема в том, что, хотя вы не выполняете isInitialStickyBroadcast(), загрузчик классов пытается разрешить все методы при загрузке класса, поэтому ваши устройства SDK 4 в этот момент отказывают, поскольку isInitialStickyBroadcast().

У вас есть два основных варианта:

  1. Использовать отражение.
  2. Создайте две версии вашего BroadcastReceiver как публичные классы в своих собственных файлах. У одного есть логика SDK 4, у другого - логика SDK 5+. Зарегистрируйте тот, который вы хотите, на основе проверки SDK во время звонка registerReceiver().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...