onStart()和onResume()之间的区别


176

我无法理解onStart()过渡状态的含义。该onResume()方法总是在after之后调用onStart()。为什么不能将onResume()after之后的方法onRestart()onCreate()方法仅仅排除在外onStart()?目的是什么?

为什么我们不能没有生活onStart()。我仍然认为它是多余的(可能是因为无法完全理解其含义)。


在此处查找应用程序生命周期:d.android.com/guide/topics/fundamentals.html
ykatchou 2010年

这东西很简单。尝试用Fragments进行解释,现在这是 ya android编程!
Scott Biggs 2015年

下面的答案没有包含解释的实际代码。是用片段解释它的代码。
Atul 2016年

Answers:


306

为什么不能仅将onStart()排除在onRestart()和onCreate()方法之后调用onResume()?目的是什么?

好的,因为我的第一个答案很长,所以我不会进一步扩展它,所以让我们尝试一下...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

请注意:我故意省略了对诸如super.onCreate(...)etc之类的调用。这是伪代码,因此请在此处给我一些艺术许可。;)

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()的越多,我重复的事情就越多。

所以,再次报价...

为什么不能仅将onStart()排除在onRestart()和onCreate()方法之后调用onResume()?

如果您不重写,onStart()则实际上是发生的情况。尽管的onStart()方法Activity将被隐式调用,但是代码中的效果实际上是onCreate() -> onResume()onRestart() -> onResume()


这意味着,无论onCreate()onRestart()会分享很多共同的代码,对不对?
Dheeraj Vepakomma 2012年

1
@Dheeraj:不一定。这是伪代码,仅用于说明如何使用Activity生命周期的每个阶段。onCreate(...)当实例化实例成员(UI元素等)时,创建阶段可能会做很多工作,但是“重新启动”不需要这样做。实际上,实际上Activities并不需要很多实现onCreate(...)onResume()onPause()在您可能需要做其他事情并且关键是要了解将代码放置在何处的情况下,可以使用其他方法。
Squonk

1
这就是为什么与iOS甚至WP7相比,我都讨厌Android API的原因……我一直在制作一款可以在C#中全部三个平台上运行的游戏,我不得不说我对Google和Android感到非常失望。语言/ API设计部门似乎缺少他们。我非常希望其他Linux电话OS能够接手,因为我一般都会投票支持Open Source ...
zezba9000

2
@Tim:好的,想出一个更好的设计。当有人正在使用某个应用程序(您的应用程序)并且突然接到电话时,您将如何处理手机上的情况?应用程序设计人员没有明确调用Activity生命周期方法-它是由Android OS来执行的,并且效率很高(假设应用程序开发人员知道他们在做什么并且也有效地进行了编码)。如果您进行了大量的Android开发,您将了解事情为什么以它们的方式运作-它不是100%完美的,但却是相当不错的。
Squonk

9
我认为Nilesh在下面的答案要清楚得多。onStart和之间的主要区别onResume是“可见性”和“用户交互”。这个驾驶汽车的隐喻令人困惑,但并没有真正的帮助。
KJ 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.