Android活动生命周期:为什么不首先强制调用super方法?

时间:2014-06-17 17:24:52

标签: java android android-activity non-virtual-interface

基本Android开发的一个要求(根据Google文档)是,当您覆盖活动的生命周期方法(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模式是什么,所以我要去假设没有充分的理由,它就是这样的。"

2 个答案:

答案 0 :(得分:4)

您不必将super方法称为方法的第一个语句。有时你可能想在调用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();
}

答案 1 :(得分:0)

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