如何调用“isInitialStickyBroadcast()”并避免1.6上的问题?

时间:2010-01-09 22:20:36

标签: android

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();
                }
            }
        }
    }
}; 

1 个答案:

答案 0 :(得分:1)

您的问题是,当您不执行isInitialStickyBroadcast()时,类加载器会尝试在加载类时解析所有方法,因此您的SDK 4设备在此时失败,因为没有{{1} }。

您有两个主要选择:

  1. 使用反射。
  2. 创建两个版本的isInitialStickyBroadcast(),作为自己文件中的公共类。一个具有SDK 4逻辑,一个具有SDK 5+逻辑。在您致电BroadcastReceiver时,根据SDK检查注册所需的一个。