Android:覆盖onPause和onResume - 正确的方法

时间:2012-10-19 12:48:06

标签: java android design-patterns

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

6 个答案:

答案 0 :(得分:16)

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

  

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

因此,对于生命周期回调,例如onPause()onResume(),我们应该在开始时执行super.onPause()super.onResume()。对于其他方法,这一切都取决于超类的语义。

答案 1 :(得分:15)

更新:这是已接受的答案,它包含大量优质信息,包括有用的图表,汇总到一个地方。但是,它似乎不正确,至少根据当前的Android文档,正如海报所指出的那样,它是SDK信息的最终来源。在发布此答案后,可能会澄清文档。但是,无论如何,不​​要停止阅读这个答案,请查看espinchi's answer below。它有文档。


super方法的放置仅取决于您的偏好。只要这些方法采用参数或者如果您正在进行一些并发工作,那将是唯一的问题。例如,如果您这样做:

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

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

我建议您阅读所有可用的文档,因为它们会对您有所帮助。例如,您可以在onPause javadoc中找到这些内容。我把重要部分加了出来:

  

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

     

当活动B在活动A前面启动时,此回调将会   可以在A上调用。在A的onPause()返回之前,不会创建B.所以   一定不要在这里做任何冗长的事情。

     

这个回调主要用于保存任何持久状态   活动正在编辑,向用户呈现“就地编辑”模型   如果没有足够的资源,确保没有任何损失   在没有先杀死这个活动的情况下开始新活动。这也是一个   做停止动画和其他事情的好地方   消耗一个显着数量的CPU ,以便切换到   下一个活动尽可能快,或关闭资源   独家访问,如相机。

     

在系统需要更多内存的情况下,它可能会暂停   回收资源的过程。因此,你应该确定   当你从这里返回时,你的所有状态都会被保存   功能即可。一般来说onSaveInstanceState(Bundle)用于保存   活动中的每个实例状态,此方法用于存储   全局持久性数据(在内容提供者,文件等中)

     

收到此电话后,您通常会收到以下电话   onStop()(在下一个活动恢复并显示之后),   但是在某些情况下会直接回调onResume()   没有经过停止状态。

     

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

我建议您使用此流程图,它将极大地帮助您的开发:

Android Activity Flowchart

答案 2 :(得分:4)

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

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

这背后的理论是,我喜欢让超级方法在构建某些东西的时候首先运行,以防我正在做的事情取决于超类首先设置什么,当撕下一些东西时,我喜欢撕裂在超级类别之前撕下我自己的东西。

答案 3 :(得分:3)

没有对错。 这取决于您在实施这些方法时所做的工作。 有时您会希望super在您的代码之前,以及之后的某个时间。

答案 4 :(得分:2)

你可以把它放在任何地方。首先,您必须了解活动生命周期。请查看以下链接Here

下载演示并运行它你会很清楚

答案 5 :(得分:2)

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

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

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