isInitialStickyBroadcast()
显然仅在2.0(SDK 5)之后可用。
我收到此错误:
“未捕获的处理程序:由于未捕获的异常而导致线程主退出
java.lang.VerifyError”
它仅在1.6上发生。 Android 2.0及更高版本没有任何问题,但这是所有问题的重点。
我无法捕获到错误/异常(java.lang.VerifyError),并且我知道它是由调用isInitialStickyBroadcast()引起的,而这在SDK 4中不可用,这就是将其包装在SDK检查中的原因。
我只需要这个BroadcastReceiver可以在2.0+上工作,而不能在1.6上突破,它是市场上的一个应用程序,在2.0+上的用户需要UNDOCK功能,但显然在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();
}
}
}
}
};
最佳答案
您的问题是,当您不执行isInitialStickyBroadcast()
时,类加载器会在加载类时尝试解析所有方法,因此您的SDK 4设备此时将失败,因为没有isInitialStickyBroadcast()
。
您有两个主要选择:
使用反射。
在自己的文件中创建两个版本的BroadcastReceiver
,作为公共类。一种具有SDK 4逻辑,一种具有SDK 5+逻辑。在调用registerReceiver()
时,根据SDK检查来注册所需的对象。