gpt4 book ai didi

java - Android Activity生命周期: why isn't calling the super method first enforced?

转载 作者:行者123 更新时间:2023-12-01 18:30:54 27 4
gpt4 key购买 nike

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

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

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

Android 的 Activity 基类可能如下所示(粗略示例):

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 方法之前编写任何指令的情况。是否有任何时候我们不应该调用 super 方法,或者不首先调用它?如果它确实必须始终是生命周期中任何特定方法的第一个,那么设计决定不使用 NVI 模式来强制执行它的原因是什么?

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

最佳答案

您不必调用 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();
}

关于java - Android Activity生命周期: why isn't calling the super method first enforced?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com