Android:有没有解决SuperNotCalledException的方法?

时间:2011-10-20 00:41:59

标签: android android-ndk

我正在尝试覆盖从Activity派生的类(称为NativeActivity),因此我可以设置我自己的用Java创建的内容视图,同时保留其余的功能。我必须使用NativeActivity,因为它是在Xperia Play上获得触摸板输入的唯一方法。我需要覆盖的方法是NativeActivity.onCreate()方法,因为这是我不想要的内容视图的设置。问题是,如果我在重写的onCreate()方法中没有调用super.onCreate(),则抛出SuperNotCalledException。这来自Activity类。但是所有Activity.onCreate()方法都设置了一个布尔值:

        protected void onCreate(Bundle savedInstanceState) {
            mVisibleFromClient = !mWindow
                    .getWindowStyle()
                    .getBoolean(
                            com.android.internal.R.styleable.Window_windowNoDisplay,
                            false);
            mCalled = true;
        }

我可以使用Activity.getWindow()方法检查我自己的代码。不幸的是,mCalled布尔值是私有的,所以我不能在我自己的代码中将它设置为true。我似乎无法弄清楚如何绕过这个要求。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

在活动上覆盖此方法时,您必须致电super.onCreate(savedInstance)

通过代码挖掘此检查看起来似乎是为了确保任何自定义Instrumentation正常工作。在我们所有的自定义活动中调用super对某些方法的要求是实现的意外后果。

如果没有详细介绍为什么这是一个糟糕的OOP设计,我可以说至少它很简单,只需在你的onCreate()方法中调用super.onCreate(savedInstanceState)。从代码中可以看出,没有不良副作用。

答案 1 :(得分:0)

我从研究Activity的源代码中得出的一点是,您可以调用其中一个方法,在基本的Activity子句中将mCalled设置为true,这些方法不会在子类中重写,并且在基本Activity中不执行任何操作类。因此,对于NativeActivty,可以调用类似super.onRestart();的内容,因为NativeActivity不会覆盖此类,正如您在下面所看到的,它在Activity类中没有做任何事情:

protected void onRestart() {
    mCalled = true;
}

这是非常hackish,并且可能在未来的某个版本中被破解,但如果你不想因为一个简单的布尔值而不想重新创建整个Activity的子类,那么它可以是一个快速的解决方案。