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检查来注册所需的对象。

10-07 19:37
查看更多