Java 安卓活动生命周期:为什么不';你不先调用超级方法吗?
基本Android开发的一个要求(根据Google文档)是,当您覆盖活动的生命周期方法(onCreate、onResume、onPause等)时,必须首先调用父方法:Java 安卓活动生命周期:为什么不';你不先调用超级方法吗?,java,android,android-activity,non-virtual-interface,Java,Android,Android Activity,Non Virtual Interface,基本Android开发的一个要求(根据Google文档)是,当您覆盖活动的生命周期方法(onCreate、onResume、onPause等)时,必须首先调用父方法: @Override protected void onResume() { super.onResume(); } 为什么Android API不使用非虚拟接口模式来强制执行此行为,而不是依赖开发人员记住这样做 Android的Activity基类可以如下所示(粗略示例): Android开发者编写的子类: public
@Override
protected void onResume()
{
super.onResume();
}
为什么Android API不使用非虚拟接口模式来强制执行此行为,而不是依赖开发人员记住这样做
Android的Activity基类可以如下所示(粗略示例):
Android开发者编写的子类:
public class MainActivity extends Activity
{
@Override
protected void virtualOnResume()
{
// do custom stuff here, without needing to call super.onResume()
}
}
我没有遇到过在调用super方法之前需要编写任何指令的情况。有没有什么时候我们不应该调用super方法,或者不应该先调用它?如果它真的必须始终是生命周期中任何特定方法的第一个,那么设计决策背后不使用NVI模式来实施它的原因是什么
更新:已经为Android开发了一段时间了,工作中的每个人都使用我的BaseActivity NVI类,我还没有找到一个理由不在所有生命周期方法中使用NVI,只在onCreate方法中使用NVI。似乎那些为现有API设计辩护的人并没有真正的理由,或者说他们似乎并不真正理解NVI模式是什么,所以我假设没有什么好的理由,那就是“它是怎样的。”您不必调用super方法作为方法的第一条语句。有时,您可能希望在调用super方法之前和之后执行一些操作 例如,见:
@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();
}
您不必调用超级方法作为方法的第一条语句。有时,您可能希望在调用super方法之前和之后执行一些操作 例如,见:
@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();
}
这是一个API设计选择。它使API表面更小(方法更少),是一种标准模式()。这是一种API设计选择。它使API表面更小(方法更少),是一种标准模式()。您不必调用
super.onResume()代码>在活动中,仅调用super.onCreate(…)
是必需的。除此之外,您可以完全覆盖任何方法。谷歌文档明确表示,在所有生命周期方法上始终调用super的方法。不管怎样,即使只是onCreate方法,同样的问题仍然存在:为什么不使用NVI呢?你能链接到文档中说明这一点的部分吗?因为只有onCreate()
才需要它。如果在onCreate()
中不调用super.onCreate()
,将引发异常。@XaverKapeller in,它说:这些生命周期方法的实现必须在执行任何不必调用super.onResume()的工作之前始终调用超类实现代码>在活动中,仅调用super.onCreate(…)
是必需的。除此之外,您可以完全覆盖任何方法。谷歌文档明确表示,在所有生命周期方法上始终调用super的方法。不管怎样,即使只是onCreate方法,同样的问题仍然存在:为什么不使用NVI呢?你能链接到文档中说明这一点的部分吗?因为只有onCreate()
才需要它。如果在onCreate()
中不调用super.onCreate()
,将引发异常。@XaverKapeller in,它说:这些生命周期方法的实现必须在执行任何工作之前始终调用超类实现,而NVI模式不是因为。。。?()而NVI模式不是因为。。。?回答得好。这显然违背了他们在文件中的建议。所有其他生命周期方法也存在这种情况吗?答案很好。这显然违背了他们在文件中的建议。所有其他生命周期方法是否也存在这种情况?