我不理解 onStart()
过渡状态的意义。无论如何,onResume()
方法总是在 onStart()
之后被调用。为什么不能让 onResume()
在除了 onStart()
以外的方法(比如 onRestart()
和 onCreate()
)之后被调用呢?它的目的是什么?
为什么我们离不开 onStart()
。我仍然认为它是多余的(可能是因为我没有完全理解它的含义)。
我不理解 onStart()
过渡状态的意义。无论如何,onResume()
方法总是在 onStart()
之后被调用。为什么不能让 onResume()
在除了 onStart()
以外的方法(比如 onRestart()
和 onCreate()
)之后被调用呢?它的目的是什么?
为什么我们离不开 onStart()
。我仍然认为它是多余的(可能是因为我没有完全理解它的含义)。
为什么onResume()方法不能在onRestart()和onCreate()方法之后调用,只排除onStart()方法?它的目的是什么?
好的,既然我的第一个答案已经很长了,我不会再进一步延伸,那么让我们尝试这个简短的回答...
public DriveToWorkActivity extends Activity
implements onReachedGroceryStoreListener {
}
public GroceryStoreActivity extends Activity {}
请注意:我故意省略了像super.onCreate(...)
等调用。这是伪代码,所以请给我一些艺术许可。;)
DriveToWorkActivity
的方法如下...protected void onCreate(...) {
openGarageDoor();
unlockCarAndGetIn();
closeCarDoorAndPutOnSeatBelt();
putKeyInIgnition();
}
protected void onStart() {
startEngine();
changeRadioStation();
switchOnLightsIfNeeded();
switchOnWipersIfNeeded();
}
protected void onResume() {
applyFootbrake();
releaseHandbrake();
putCarInGear();
drive();
}
protected void onPause() {
putCarInNeutral();
applyHandbrake();
}
protected void onStop() {
switchEveryThingOff();
turnOffEngine();
removeSeatBeltAndGetOutOfCar();
lockCar();
}
protected void onDestroy() {
enterOfficeBuilding();
}
protected void onReachedGroceryStore(...) {
Intent i = new Intent(ACTION_GET_GROCERIES, ..., this, GroceryStoreActivity.class);
}
protected void onRestart() {
unlockCarAndGetIn();
closeDoorAndPutOnSeatBelt();
putKeyInIgnition();
}
好的,这是一个有点长的问题(对不起),但是这是我解释的方法...
onResume()
是当我开始驾驶时调用的函数,而 onPause()
是当我暂停时调用的。所以我驾驶,然后到达红灯,所以我暂停...当灯变绿色时我继续行驶。另一个红灯,我再次暂停,然后灯变绿色我就继续行驶了。onPause() -> onResume() -> onPause() -> onResume()
这个循环是一个紧密的循环,并且在我的旅途中经常出现。
从停止状态到重新开始(准备继续我的旅程)的循环可能不太常见。在某些情况下,我会看到杂货店,然后启动 GroceryStoreActivity
(强制使我的 DriveToWorkActivity
调用 onStop()
)。当我从商店回来时,我通过 onRestart()
和 onStart()
再次开始我的旅程。
我可以将在 onStart()
中的代码放到 onCreate()
和 onRestart()
中,而不必重写 onStart()
,但是在 onCreate() -> onResume()
和 onRestart() -> onResume()
之间需要做更多的事情,这将导致重复。
所以,再次引用一下...
为什么不是在 onRestart() 和 onCreate() 方法之后调用 onResume(),而只是排除 onStart() 呢?
如果您不重写 onStart()
,那么这实际上就是发生的事情。虽然 Activity
的 onStart()
方法会被隐式调用,但在您的代码中的效果实际上是 onCreate() -> onResume()
或者 onRestart() -> onResume()
。
onCreate()
和onRestart()
两者会共享很多相同的代码,对吗? - Dheeraj VepakommaonCreate(...)
在实例化实例成员(UI元素等)方面可能会做很多工作,但“重新启动”不需要这样做。实际上,许多“Activities”不需要实现更多的方法,只需要实现onCreate(...)
,onResume()
和onPause()
即可,其他方法可用于可能需要执行其他操作的情况,关键是要理解在哪里放置代码。 - SquonkonStart
和onResume
之间的关键差异在于“可见性”和“用户交互”。这个开车的比喻很令人困惑,也不是很有帮助。 - K J简短回答:
我们不能没有onStart,因为这是活动变得“可见”但用户还无法“交互”的状态,可能是因为它与某些其他小对话框重叠了。这种与用户交互的能力是区分onStart和onResume的关键。将其视为玻璃门后面的人。你可以看到这个人,但你不能与他互动(交谈/听/握手)。onResume就像门的开启器,之后你就可以开始互动了。
此外,onRestart()是最不被理解的一个。我们可以问为什么不直接在onStop()之后转到onStart()或onResume()而是要用onRestart()呢?如果省略创建部分,则onRestart()在某种程度上等同于onCreate()。基本上,两种状态都会导致onStart()(即Activity变得可见)。因此,这两种状态都必须“准备”要显示的内容。onCreate还有额外的责任来“创建”要显示的内容。
因此,它们的代码结构可能类似于:
onCreate()
{
createNecessaryObjects();
prepareObjectsForDisplay();
}
onRestart()
{
prepareObjectsForDisplay();
}
整个混淆是由于谷歌选择了不直观的名称,而不是以下类似内容所引起的:onCreateAndPrepareToDisplay() [instead of onCreate() ]
onPrepareToDisplay() [instead of onRestart() ]
onVisible() [instead of onStart() ]
onBeginInteraction() [instead of onResume() ]
onPauseInteraction() [instead of onPause() ]
onInvisible() [instead of onStop]
onDestroy() [no change]
活动图可以解释为:
onStart()
会在Activity对用户可见时调用。
onResume()
会在Activity即将开始与用户交互时调用。
你可能需要在这些情况下执行不同的操作。
请参阅此链接以获取更多信息。
onResume()
方法被调用:
onStart()
方法后被调用Activity
进入前台时被调用。来自于http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle:
这本书名为“Hello, Android, Introducing Google's Mobile Development Platform”,详细阐述了Android应用程序的生命周期,幸运的是,他们将特定章节作为网络摘录。请参见第39页上的图形, http://media.pragprog.com/titles/eband3/concepts.pdf
顺便说一句,这本书非常适合初学者阅读!
onStart()
onStart()
中注册 BroadcastReceiver 监听影响 UI 的变化,但必须在 onStop() 中注销它。onResume()
onStart()
通常将工作分派给后台线程,其返回值为:
START_STICKY,以自动重启并保持活动状态。
START_REDELIVER_INTENT
,以在 stopSelf() 之前如果服务被杀死时进行自动重启和重试。
当设备进入休眠状态或 Alert 或其他部分屏幕子活动离开先前窗口的一部分可见时,会调用 onResume()
,因此需要一个方法来重新初始化字段(在 try 结构中,捕获异常)。这种情况不会导致 onStop()
在子项关闭时被调用。
onResume()
从后台恢复活动时被调用,而不需要 onStart()
有关更多详细信息,请访问Android_activity_lifecycle_gotcha和Activity Lifecycle。
showDialog()
从Activity中展示一个管理的Dialog时。如果用户在对话框仍然打开的情况下旋转屏幕(我们称之为“配置更改”),则主Activity将经历所有终止生命周期调用直至onDestroy()
,将被重新创建,并再次通过生命周期。然而,您可能没有预料到的是,在onStart()
和onResume()
之间调用了onCreateDialog()
和onPrepareDialog()
(这些方法在执行showDialog()
时调用,现在会自动重新创建对话框 - 自动,因为它是一个管理的对话框)。这里的重点是对话框并不覆盖整个屏幕,因此留下了主Activity的一部分可见。这是一个细节,但确实很重要!onStart()
表示 Activity
进入可见状态并创建布局,但不能与此活动布局进行交互。
Resume()
表示现在可以与活动布局进行交互。
不确定这是否算是答案 - 但这里有一段 来自谷歌课程的YouTube视频 (使用Kotlin开发Android应用程序),解释了它们之间的区别。