17

当覆盖活动的onPause()andonResume()方法时,调用super.onPause()and的正确位置在super.onResume()哪里?在方法的开头还是结尾?

4

6 回答 6

17

更新:这是公认的答案,它包含大量有用的信息,包括一张有用的图表,并放在一个地方。然而,这似乎是不正确的,至少根据当前的 Android 文档,正如海报所指出的那样,它是 SDK 信息的最终来源。发布此答案后,可能会澄清文档。但是,无论如何,不​​要停止阅读这个答案,请查看下面的 espinchi 的答案。它有文档。


方法的放置super仅取决于您的偏好。仅当这些方法采用参数或您正在执行一些并发工作时才重要。例如,如果您这样做:

    @Override
    protected void onPause() {
        try {
            someOtherThread.join();
        } catch (InterruptedException e) {
            LOG.e(e);
        }
        super.onPause();
    }

它可能会阻塞线程并阻止super被调用。

我建议您阅读所有可用的文档,因为它们对您有很大帮助。例如,这是您可以在onPausejavadoc 中找到的内容。我将重要部分加粗:

当活动进入后台但尚未(尚未)被杀死时,作为活动生命周期的一部分调用。onResume() 的对应项。

当活动 B 在活动 A 之前启动时,将在 A 上调用此回调。在 A 的 onPause() 返回之前不会创建 B,因此请确保此处不要做任何冗长的事情。

回调主要用于保存活动正在编辑的任何持久状态,以向用户呈现“就地编辑”模型,并确保如果没有足够的资源来启动新活动而没有首先杀死该活动,则不会丢失任何内容。这也是一个很好的地方来做一些事情,比如停止动画和其他消耗大量 CPU的事情,以便尽快切换到下一个活动,或者关闭诸如相机之类的独占访问资源。

在系统需要更多内存的情况下,它可能会终止暂停的进程以回收资源。因此,您应该确保在您从此函数返回时保存所有状态。通常 onSaveInstanceState(Bundle) 用于在活动中保存每个实例的状态,此方法用于存储全局持久数据(在内容提供程序、文件等中)

收到此调用后,您通常会收到对 onStop() 的后续调用(在下一个活动已恢复并显示后),但是在某些情况下会直接调用 onResume() 而不会进入停止状态。

派生类必须调用该方法的超类实现。如果他们不这样做,将引发异常。

我确实为您推荐此流程图,它将极大地帮助您的开发:

安卓活动流程图

于 2012-10-19T12:52:30.710 回答
17

来自http://developer.android.com/guide/components/activities.html#ImplementingLifecycleCallbacks

这些生命周期方法的实现必须始终在执行任何工作之前调用超类实现,如上面的示例所示。

所以,对于生命周期回调,比如onPause()and onResume(),我们应该在一开始就做super.onPause()or super.onResume()。对于其他方法,这一切都取决于超类的语义。

于 2013-12-27T18:03:43.483 回答
4

这可能无关紧要,但要确定,您需要知道超级方法在做什么,而且通常您无法获得这些信息。

我的风格是在我自己的方法体之前调用例如 super.onCreate()、super.onResume() 等,在我自己的方法体之后调用例如 super.onPause() 和 super.onDestroy()。

这背后的理论是,我喜欢在构建某些东西时让超级方法先运行,以防万一我正在做的事情取决于超类首先设置的东西,而当拆除某些东西时,我喜欢拆除我自己的在超类拆掉它的东西之前的东西。

于 2012-10-19T17:49:04.183 回答
3

没有对与错。这取决于你对这些方法的实现做了什么。有时你会希望super在你的代码之前,有时在之后。

于 2012-10-19T12:49:26.390 回答
2

你可以把它放在任何地方。首先你要了解Activity的生命周期。检查以下链接这里

下载demo运行一下就明白了

于 2012-10-19T12:51:34.647 回答
2

深入研究android代码,你可以发现框架在调用super.onPause()时设置了一个名为mcall的标志。框架稍后在恢复时检查此标志。

if (!mCalled) {
            throw new SuperNotCalledException(
                "Activity " + mComponent.toShortString() +
                " did not call through to super.onResume()");
        }

您需要做的就是确保拨打超级电话并且您很好。无需采取其他预防措施。

于 2012-10-19T13:13:00.803 回答