当覆盖活动的onPause()
和onResume()
方法时,调用super.onPause()
和super.onResume()
的正确位置在哪里?在方法开始时还是在结束时?
答案 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() 没有经过停止状态。
派生类必须调用超类的实现 这种方法。如果他们不这样做,将抛出异常。
我建议您使用此流程图,它将极大地帮助您的开发:
答案 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()");
}
您需要做的就是确保拨打超级电话并且您很好。没有必要采取其他预防措施。