0

基本 Android 开发的要求之一(根据 Google 文档)是,当您覆盖 Activity 的生命周期方法(onCreate、onResume、onPause 等)时,必须首先调用父级的方法:

@Override
protected void onResume()
{
    super.onResume();
}

为什么 Android API 不使用非虚拟接口模式来强制执行此行为,而不是依靠开发人员记住这样做?:

Android 的 Activity Base 类可能看起来像这样(粗略的例子):

public class Activity
{
    public final void onResume()
    {
        // do important things here
        virtualOnResume();   
    }
    protected abstract void virtualOnResume();
}

Android开发者编写的子类:

public class MainActivity extends Activity
{
    @Override
    protected void virtualOnResume()
    {
        // do custom stuff here, without needing to call super.onResume()
    }
}

我还没有遇到过需要在调用 super 方法之前编写任何指令的情况。有没有什么时候我们不应该调用超级方法,或者不先调用它?如果对于生命周期中的任何特定方法,它确实必须始终处于首位,那么设计决定不使用 NVI 模式来执行它的原因是什么?

更新: 现在已经为 Android 开发了一段时间,工作中的每个人都使用我的 BaseActivity NVI 类,但我仍然没有遇到一个原因,不是对所有生命周期方法使用 NVI,而是 onCreate 方法。似乎那些为现有 API 设计辩护/评论的人并没有真正的理由,或者似乎并不真正理解 NVI 模式是什么,所以我假设没有好的原因,它“就是这样”。

4

2 回答 2

4

您不必调用超级方法作为方法的第一条语句。有时你可能想在调用 super 方法之前和之后做一些事情。

参见FragmentActivity例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    mFragments.attachActivity(this, mContainer, null);
    // Old versions of the platform didn't do this!
    if (getLayoutInflater().getFactory() == null) {
        getLayoutInflater().setFactory(this);
    }

    super.onCreate(savedInstanceState);

    NonConfigurationInstances nc = (NonConfigurationInstances)
            getLastNonConfigurationInstance();
    if (nc != null) {
        mAllLoaderManagers = nc.loaders;
    }
    if (savedInstanceState != null) {
        Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
        mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
    }
    mFragments.dispatchCreate();
}
于 2014-06-17T17:40:34.753 回答
0

这是一个 API 设计选择。它使 API 表面更小(更少的方法)并且是标准模式(http://en.wikipedia.org/wiki/Decorator_pattern)。

于 2014-06-17T17:42:58.683 回答