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

Gen*_*nry 16 java android design-patterns

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

esp*_*chi 16

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

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

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


Ada*_*old 15

更新:这是接受的答案,它包含大量的好信息,包括一个有用的图表,汇集到一个地方.然而,这似乎是不正确,至少根据当前Android文档其中,作为海报指出的那样,是用于SDK上的信息的最终来源.在发布此答案后,可能会澄清文档.但是,无论如何,请不要停止阅读这个答案,请查看下面的espinchi的答案.它有自己的文档.


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

    @Override
    protected void onPause() {
        try {
            someOtherThread.join();
        } catch (InterruptedException e) {
            LOG.e(e);
        }
        super.onPause();
    }
Run Code Online (Sandbox Code Playgroud)

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

我建议您阅读所有可用的文档,因为它们会对您有所帮助.例如,您可以在onPausejavadoc中找到它.我把重要的部分加粗了:

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

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

回调主要用于保存活动正在编辑的任何持久状态,向用户显示"就地编辑"模型,并确保在没有先杀死此活动的情况下没有足够的资源来启动新活动时不会丢失任何内容.这也是一个很好的地方,可以停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如摄像头.

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

收到此调用后,您通常会收到以下对onStop()的调用(在下一个活动已恢复并显示之后),但在某些情况下,将直接回调onResume()而不会经历停止状态.

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

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

Android活动流程图