基本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模式是什么,所以我要去假设没有充分的理由,它就是这样的。"
答案 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)。