14

Android 文档中,我们有

注意:这些生命周期方法的实现必须始终在执行任何工作之前调用超类实现......

但我见过代码放在超类方法之后的情况,尤其是 onPause()、onStop()、onDestroy() 等方法,例如:

@Override
protected void onPause() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    super.onPause();
} 

http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html#ownreceiver_localbroadcastmanager

两种方式都有效。那么,调用超类方法后,把代码放在 o 之前有什么区别呢?正确的方法是什么?

4

4 回答 4

22

直接复制自 CommonsWare 的这个答案。所以最好给他点赞

您覆盖的作为组件创建的一部分的方法(onCreate(), onStart(),onResume()等),您应该链接到超类作为第一条语句,以确保 Android 在您尝试执行依赖于该工作的事情之前有机会完成其工作已经完成。

您覆盖的作为组件销毁的一部分的方法(onPause(), onStop(),onDestroy()等),您应该首先完成您的工作,并作为最后一件事链接到超类。这样,如果 Android 清理了您的工作所依赖的东西,您将首先完成您的工作。

void 返回(等)以外的方法onCreateOptionsMenu(),有时您在 return 语句中链接到超类,假设您没有专门执行需要强制特定返回值的操作。

总体而言,其他一切(例如onActivityResult())都取决于您。我倾向于首先链接到超类,但除非您遇到问题,否则稍后链接应该没问题。

但是如果没有依赖关系,那么在你想要的任何地方调用超类方法。

于 2013-06-04T19:11:36.173 回答
6

当我对这个问题感兴趣时,我发现了这个规则:

during any kind of initialization, let the super class do their work first; 
during any kind of finalization, you do your work first

这是合乎逻辑的)

于 2013-06-04T19:12:15.797 回答
1

根据 Java 标准和最佳实践,super应该先调用。super我相信这样做的原因是,如果你没有先做这些工作,可能需要做一些工作,这会导致你的代码出现问题。

但是,我在打电话之前已经完成了工作,super并没有遇到任何问题。

我没有任何框架示例,但我有一个BaseActivityextends Activity和我的所有Activities扩展BaseActivity。我有几个方法需要在这些子类中实现。如果我不super首先调用,那么一些变量不会被初始化,所以我会得到NPEs

于 2013-06-04T19:15:21.297 回答
1

覆盖任何方法时,您可能需要调用超类实现。经验法则是,在初始化期间,您应该始终首先调用超类。

public void onCreate() {
   super.onCreate();
   // do work after super class function
   // setContentView(R.layout.main);
    }

在反初始化期间,您应该在调用超类之前先完成工作。

public void onPause() {
   // do work here first before super class function //LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
       super.onPause();
    }
于 2019-06-04T13:17:16.637 回答