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

时间:2010-12-29 11:19:21

标签: android

我无法理解onStart()过渡状态的含义。始终在onResume()之后调用onStart()方法。为什么不能在onResume()onRestart()方法之后调用onCreate()来排除onStart()?它的目的是什么?

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

12 个答案:

答案 0 :(得分:288)

  

为什么不能在onRestart()和onCreate()方法之后调用onResume()来排除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已启动(迫使我的DriveToWorkActivityonStop()点)。当我从商店返回时,我会经过onRestart()onStart()然后继续我的旅程。

我可以将onStart()中的代码放入onCreate()onRestart()中,而不必费心覆盖onStart(),但需要在onCreate() -> onResume()之间进行更多操作{1}}和onRestart() -> onResume(),我复制的东西越多。

所以,再次重新引用......

  

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

如果你没有覆盖onStart()那么这实际上就是这样。虽然隐式调用onStart() Activity方法,但代码中的效果实际上是onCreate() -> onResume()onRestart() -> onResume()

答案 1 :(得分:132)

简短回答:

我们不能没有onStart,因为这是活动对用户“可见”的状态,但是用户无法与之“交互”但可能是因为它与其他一些小对话框重叠。这种与用户交互的能力是区分onStart和onResume的能力。把它想象成一个玻璃门后面的人。你可以看到这个人,但你不能与他互动(说话/倾听/握手)。 OnResume就像开门人,之后就可以开始互动了。

另外onRestart()是最不被理解的。我们可以问一下这个问题,为什么不在onStop()之后直接转到onStart()或onResume()而不是onRestart()。 如果我们注意到onRestart()部分等效于onCreate(),如果省略了创建部分,则会更容易理解。基本上两个状态都导致onStart()(即Activity变得可见)。所以两个州都必须“准备”要显示的东西。 OnCreate还有责任“创建”要显示的内容

所以他们的代码结构可能适用于:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

由于Google选择了非直观的名称而不是以下内容,导致整个混乱:

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] 

活动图可能被解释为:

Android Activity Lifecycle

答案 2 :(得分:26)

当活动对用户可见时,

onStart()被调用。 当活动开始与用户交互时调用onResume()。 在这种情况下,您可能想要做不同的事情。

请参阅this link以供参考。

答案 3 :(得分:16)

onResume()被称为:

  1. onStart()
  2. 之后
  3. Activity到达前台时。
  4. 来自http://developer.android.com/reference/android/app/Activity.html#ActivityLifecyclealt text

答案 4 :(得分:9)

答案 5 :(得分:7)

一个特别鲜明的例子是当您决定使用showDialog()从活动中显示托管对话框时。如果用户在对话框仍然打开时旋转屏幕(我们称之为“配置更改”),那么主Activity将经历所有结束生命周期调用,直到onDestroy(),将重新创建,然后返回通过生命周期。但是,您可能没有想到的是onCreateDialog()onPrepareDialog()(当您执行showDialog()时调用的方法,现在再次自动重新创建对话框) - 因为它是托管对话框)在 onStart()onResume()之间被称为。这里的pointe是对话框没有覆盖整个屏幕,因此可以看到主要活动的一部分。这是一个细节,但它确实很重要!

答案 6 :(得分:7)

onStart()

  1. 在onCreate(Bundle)之后或onRestart()之后调用 的 的onResume() 即可。
  2. 您可以在onStart()中注册BroadcastReceiver以监控更改 这会影响您的UI,您必须在onStop()
  3. 中取消注册
  4. 衍生课程必须通过超级课程 实现这种方法。如果他们不这样做,将会有例外 抛出。
  5. <强> onResume()

    1. 在onRestoreInstanceState(Bundle),onRestart()或之后调用         的onPause()
    2. 开始制作动画,打开独家访问设备(例如相机)
    3. onStart() 通常会将工作分派给后台线程,后台线程的返回值为:

      • START_STICKY 如果被杀,则自动重启,以使其保持活动状态。

      • START_REDELIVER_INTENT 用于自动重启,如果服务在stopSelf()之前被杀死则重试。

      设备进入睡眠状态或警报或其他部分屏幕子活动使前一个窗口的一部分可见后,操作系统会调用

      onResume() ,因此需要一种方法重新初始化字段(在具有异常捕获的try结构中)。  当孩子关闭时,这种情况不会导致onStop()被调用。

      当活动从后台恢复时,

      onResume()在没有 onStart() 的情况下被调用

      有关详细信息,您可以访问Android_activity_lifecycle_gotchaActivity Lifecycle

答案 7 :(得分:4)

onStart()表示Activity已进入可见状态,并且已创建布局,但无法与此活动布局进行交互。

Resume()表示您现在可以与活动布局进行互动。

答案 8 :(得分:2)

希望有一个简单的解释: -

onStart() - &gt;当活动变得可见时调用,但可能不在前台(例如,AlertFragment位于顶部或任何其他可能的用例)。

onResume() - &gt;当活动在前台时调用,或者用户可以与活动交互。

答案 9 :(得分:1)

请注意,在调用onStart()和onResume()之间会发生一些事情。即onNewIntent(),我痛苦地发现了。

如果您正在使用SINGLE_TOP标志,并且使用intent extras将一些数据发送到您的活动,您将只能在onNewIntent()中访问它,该onNewIntent()在 onStart之后称为( )和之前 onResume()。通常,您将从附加内容中获取新的(可能只是修改过的)数据并将其设置为某些类成员,或使用setIntent()将新intent设置为原始活动intent并在onResume()中处理数据。 / p>

答案 10 :(得分:0)

参考http://developer.android.com/training/basics/activity-lifecycle/starting.html

onResume()在活动开始与用户交互之前调用。此时,活动位于活动堆栈的顶部,用户输入转到活动堆栈。 始终跟着onPause()

onPause()当系统即将开始恢复另一项活动时调用。此方法通常用于将未保存的更改提交到持久数据,停止动画以及可能正在消耗CPU的其他内容,等等。它应该尽快做任何事情,因为下一个活动在返回之前不会恢复。 如果活动返回到前面,则由onResume()跟随,如果对用户不可见,则由onStop()跟随。

答案 11 :(得分:0)

不确定这是否可以作为答案-但这是YouTube Video From Google's Course(使用Kotlin开发Android应用程序)解释的区别。

    当活动可见 时,
  • 在开始时被调用 当活动失去焦点(如弹出对话框)时,
  • 暂停时调用
  • 当活动获得焦点(例如对话框消失时)时,会调用
  • “恢复”。