- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚浏览了Android Developer Site,刷新了Activity生命周期,在每个代码示例中,父类(super class)方法旁边都有一条注释,上面写着“始终首先调用父类(super class)方法”。
虽然这在创建半周期:onCreate、onStart 和 onResume 中是有意义的,但我对销毁半周期的正确过程有点困惑:onPause、onStop、onDestroy。
在销毁特定于实例的资源可能依赖的父类(super class)资源之前,首先销毁实例特定的资源是有意义的,而不是相反。但评论表明并非如此。我错过了什么?
编辑:由于人们似乎对问题的 Intent 感到困惑,我想知道以下哪项是正确的? 为什么?
1.Google 建议
@Override
protected void onStop() {
super.onStop(); // Always call the superclass method first
//my implementation here
}
2.另一种方式
@Override
protected void onStop() {
//my implementation here
super.onStop();
}
最佳答案
Destroying the instance specific resources first, before destroying superclass resources that the instance specific resources may depend upon makes sense, not the other way round. But the comments suggest otherwise. What am I missing?
在我看来:不是一件事。
Mark(又名 CommonsWare on SO)的这个回答阐明了这个问题:Link - Should the call to the superclass method be the first statement? .但是,您可以在他的回答中看到以下评论:
But why official doc says: "Always call the superclass method first" in onPause()?
回到第一格。好吧,让我们从另一个角度来看这个。我们知道 Java 语言规范没有指定必须放置对 super.overridenMethod()
的调用的顺序(或者是否必须放置调用)。
在类 Activity 的情况下,super.overridenMethod()
调用是必需的并且强制:
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
" did not call through to super.onStop()");
}
mCalled
在 Activity.onStop()
中设置为 true。
现在,唯一需要讨论的细节是排序。
我也知道两者都有效
当然。查看Activity.onPause()的方法体:
protected void onPause() {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
// This is to invoke
// Application.ActivityLifecyleCallbacks.onActivityPaused(Activity)
getApplication().dispatchActivityPaused(this);
// The flag to enforce calling of this method
mCalled = true;
}
无论您采用哪种方式调用 super.onPause()
,都可以。 Activity.onStop() 有一个类似的方法体。但是看看Activity.onDestroy():
protected void onDestroy() {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
mCalled = true;
// dismiss any dialogs we are managing.
if (mManagedDialogs != null) {
final int numDialogs = mManagedDialogs.size();
for (int i = 0; i < numDialogs; i++) {
final ManagedDialog md = mManagedDialogs.valueAt(i);
if (md.mDialog.isShowing()) {
md.mDialog.dismiss();
}
}
mManagedDialogs = null;
}
// close any cursors we are managing.
synchronized (mManagedCursors) {
int numCursors = mManagedCursors.size();
for (int i = 0; i < numCursors; i++) {
ManagedCursor c = mManagedCursors.get(i);
if (c != null) {
c.mCursor.close();
}
}
mManagedCursors.clear();
}
// Close any open search dialog
if (mSearchManager != null) {
mSearchManager.stopSearch();
}
getApplication().dispatchActivityDestroyed(this);
}
在这里,排序可能可能很重要,具体取决于您的 Activity 设置方式,以及调用 super.onDestroy()
是否会干扰后面的代码。
最后一句话,始终首先调用父类(super class)方法
这句话似乎没有太多证据支持它。更糟糕的是(对于语句)以下代码取自 android.app.ListActivity
:
public class ListActivity extends Activity {
....
@Override
protected void onDestroy() {
mHandler.removeCallbacks(mRequestFocus);
super.onDestroy();
}
....
}
并且,来自 android sdk 中包含的 LunarLander 示例应用程序:
public class LunarLander extends Activity {
....
@Override
protected void onPause() {
mLunarView.getThread().pause(); // pause game when Activity pauses
super.onPause();
}
....
}
总结和值得一提:
用户 Philip Sheard :提供一个场景,如果使用 startActivityForResult(Intent) 启动 Activity,则必须延迟对
。使用 super.onPause()
的调用setResult(...)
after super.onPause()
设置结果将不起作用。他后来在对他的回答的评论中澄清了这一点。
User Sherif elKhatib:解释为什么让父类(super class)首先初始化其资源并最后销毁其资源的逻辑:
Let us consider a library you downloaded which has a LocationActivity that contains a getLocation() function that provides the location. Most probably, this activity will need to initialize its stuff in the onCreate() which will force you to call the super.onCreate first. You already do that because you feel it makes sense. Now, in your onDestroy, you decide you want to save the Location somewhere in the SharedPreferences. If you call super.onDestroy first, it is to a certain extent possible that getLocation will return a null value after this call because the implementation of LocationActivity nullifies the location value in the onDestroy. The idea is that you wouldn't blame it if this happens. Therefore, you would call super.onDestroy at the end after you're done with your own onDestroy.
他继续指出:如果子类与父类适当隔离(在资源依赖方面),则 super.X()
调用不需要遵守任何顺序规范.
请参阅他在此页面上的回答,以通读 super.onDestroy()
调用 确实 影响程序逻辑的场景。
来自 Mark 的回答:
Methods you override that are part of component creation (onCreate(), onStart(), onResume(), etc.), you should chain to the superclass as the first statement, to ensure that Android has its chance to do its work before you attempt to do something that relies upon that work having been done.
Methods you override that are part of component destruction (onPause(), onStop(), onDestroy(), etc.), you should do your work first and chain to the superclass as the last thing. That way, in case Android cleans up something that your work depends upon, you will have done your work first.
Methods that return something other than void (onCreateOptionsMenu(), etc.), sometimes you chain to the superclass in the return statement, assuming that you are not specifically doing something that needs to force a particular return value.
Everything else -- such as onActivityResult() -- is up to you, on the whole. I tend to chain to the superclass as the first thing, but unless you are running into problems, chaining later should be fine.
Bob Kerns 来自 this thread :
It's a good pattern [(the pattern that Mark suggests above)], but I've found some exceptions. For example, the theme I wanted to apply to my PreferenceActivity wouldn't take effect unless I put it before the superclass's onCreate().
用户 Steve Benett 也注意到了这一点:
I only know one situation, where the timing of the super call is necessary. If you wanna alter the standard behavior of the theme or the display and such in onCreate, you have to do it before you call super to see an effect. Otherwise AFAIK there is no difference at which time you call it.
用户 Sunil Mishra 确认在调用 Activity 类的方法时顺序(很可能)不起作用。他还声称首先调用父类(super class)方法被认为是最佳实践。但是,我无法证实这一点。
User LOG_TAG :解释为什么调用父类(super class)构造函数 需要在所有其他事情之前。在我看来,这种解释并没有增加所提出的问题。
尾注:信任,但验证。此页面上的大多数答案都遵循这种方法,以查看语句 始终首先调用父类(super class)方法
是否具有逻辑支持。事实证明,它没有;至少,在类 Activity 的情况下不是这样。通常,应该通读父类(super class)的源代码以确定是否需要对父类(super class)方法的排序调用。
关于java - 在 onPause、onStop 和 onDestroy 方法中调用父类(super class)方法的正确顺序是什么?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18821481/
我正在阅读有关 Activity 生命周期方法的文档 here 这是文档中表格的快照。 onStop() 方法在此处被标记为可终止。但是,尚不清楚 Activity 何时可以终止 - 在基础 Acti
我想实现某种监视功能,该功能可以告诉我我的应用何时崩溃或停止或暂停。因此,我有3个 Activity ,到目前为止我已经实现了,以便在mainActivity中调用onPause时,它会向我发送一封邮
我有一个应用程序,其 onStop() 方法中有一个 while 循环。在日志中我发现了这一行: 07-06 08:35:43.616 W/ActivityManager( 837): Activi
是否可以让 SFML 1.6 自行处理音乐结尾?目前我有这个: //in music.cpp music.Play() //in main.cpp //on every frame check for
简介:我做了一个淡出/淡入淡出所有 View 的不透明度。我想在切换 Activity 之间制作动画。我现在必须将淡入/淡出添加到每个 Activity 中的每个 onStop/onResume。 问
我想制作一个无法被杀死或破坏的应用程序。我试过了 @Override public void onStop() { super.onPause(); } 但这不起作用,应用程序仍然被杀死。那
我的应用程序从服务接收消息,它必须对其执行一些处理。在此之前,它必须连接到另一个服务 (GoogleApiClient)。发生的情况是应用程序调用 onStop 之前 GoogleApiClient
我尝试使用onStop()方法,但调用时代码并未执行。 我正在使用 TabHost 从一个 Activity 移动到另一个 Activity 。 当我移动到另一个选项卡时,此代码应该可以工作。 @Ov
我正在尝试获取 Activity 生命周期的日志。我在这里遇到了一些奇怪的问题。 当我将 Activity 的主题用作 android:theme="@style/Theme.AppCompat.Li
我有一个媒体播放器,它会在用户关闭应用程序时停止播放,方法是按下主页按钮、使用后退按钮或只是打开另一个应用程序。为获得此行为,我向我的主要 Activity 添加了一个 onStop(),它告诉我的
我发现我的 Activity onStop() 方法将在不到 10 秒的延迟后被调用。我以前从未见过这种行为。 Note :- The activity is singleTop and it sta
我在类似的时钟应用程序中使用了这个示例代码: http://about-android.blogspot.in/2010/04/create-apps-to-show-digital-time-in_
目前,我将平板电脑连接到其他设备(通过蓝牙)。连接成功,但如果 Activity 暂停并停止,例如按下主屏幕时,它肯定会断开连接。我总是可以在 OnStop() 或其他东西中重新连接,但我想在整个过程
为什么程序在“String temp_str = string_array[1]”处崩溃?Logcat:java.lang.NullPointerException:尝试读取空数组。 public c
我终于完成了应用程序中的所有内容,但现在每当我使用除“主页”按钮之外的任何操作退出它时,它都会闪烁强制关闭屏幕,然后它就会消失。我知道这没什么大不了的,但我真的希望这种情况停止发生,我终于得到了一个
我使用 Azure 云辅助角色来处理来自队列的传入任务。每个任务的处理最多可能需要几个小时,每个工作角色最多可以同时处理 N 个任务。基本上,它正在工作。 现在,您可以阅读documentation有
在我的简单 android 应用程序中,我有 2 个 activities。在第一个 activity(主要 Activity )中,我覆盖了 ON STOP 方法。但是当我去做第二个 activit
如果我有一个名为 onStop 的方法,它会调用 super.onStop();。这个方法什么时候运行? 在我的主要 Activity 中,我启动了另一个 Activity ,如下所示:startAc
在我的主要 Activity 中,在 onStop 下,我设置了 myVar = true。在 onResume 中,我检查 myVar = true 并执行某些操作。 如果您在我的主要 Activi
我有一个 Activity,我想在不调用 onDestroy() 的情况下关闭它。所以我使用 onStop(); 看起来像 @Override public void onStop(){
我是一名优秀的程序员,十分优秀!