OnStart ()和 onResume ()的区别

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

为什么我们不能没有 onStart()而生活。我仍然认为它是多余的(可能是因为不完全理解它的意思)。

113653 次浏览

当活动对用户可见时调用 onStart()。 当活动开始与用户交互时调用 onResume()。 在这种情况下,您可能需要执行不同的操作。

请参阅 这个链接

“你好,Android,介绍 Google 的移动开发平台”这本书对 Android 应用的生命周期给出了一个很好的解释。幸运的是,他们在网上有这个章节的摘录。请参见第39页的图表 Http://media.pragprog.com/titles/eband3/concepts.pdf

顺便说一下,这本书是非常推荐的机器人初学者!

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

onResume()的名称是:

  1. onStart()之后
  2. Activity出现在前台时。

来自 http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle: alt text

为什么不能是在 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()onRestart() -> onResume()之间需要做的事情越多,我复制的东西就越多。

那么,再重复一次..。

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

如果不覆盖 onStart(),那么实际上就会发生这种情况。虽然 ActivityonStart()方法将被隐式调用,但是代码中的效果实际上是 onCreate() -> onResume()onRestart() -> onResume()

简短的回答:

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

另外,onRestart ()是理解最少的一个。我们可以问这样一个问题,为什么不在 onStop ()之后直接转到 onStart ()或 onResume () ,而不是 onRestart ()。 如果省略创建部分,那么 onRestart ()与 onCreate ()是部分等价的,这就更容易理解了。基本上这两种状态都会导致 onStart ()(即活动变得可见)。因此,两个州都必须“准备”要展示的东西。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]

活动图可解释为:

Android Activity Lifecycle

请注意,在调用 onStart ()和 onResume ()之间会发生一些事情。换句话说,onNewInent () ,我已经痛苦地发现了。

如果您使用 SINGLE _ TOP 标志,并且使用意图附加值向活动发送一些数据,那么您将只能在 onNewInent ()中访问它,这被称为 之后 onStart ()和 之前 onResume ()。因此,通常,您将从额外的数据中获取新的(可能只是修改过的)数据,并将其设置为某些类成员,或者使用 setInent ()将新意图设置为原始活动意图,并在 onResume ()中处理数据。

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

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

当系统即将开始恢复另一个活动时调用。此方法通常用于对持久数据提交未保存的更改、停止动画和其他可能占用 CPU 的内容,等等。它应该非常快速地执行任何操作,因为下一个活动在返回之前不会继续。 如果活动返回到前端,则接着是 onResume(); 如果活动对用户不可见,则接着是 onStop()

onStart()

  1. 在 onCreate (Bundle)之后或 onRestart ()之后调用 OnResume () .
  2. 您可以在 onStart()中注册 BroadcastReceiver 来监视更改 你必须在 onStop ()中注销它
  3. 派生类必须调用超类的 如果它们不执行此方法,则会出现异常 抛出。

onResume()

  1. 在 onRestoreInstanceState (Bundle)、 onRestart ()或 暂停()
  2. 开始动画,打开独占访问设备(如相机)

onStart() 通常将工作分派给后台线程,后台线程的返回值是:

  • START _ STICKY 在被杀死时自动重新启动,保持活动状态。

  • 如果服务在 stopSelf ()之前被终止,则自动重新启动并重试。

onResume() 在设备进入休眠状态或者在 Alert 或其他部分屏幕子活动使前一个窗口的一部分可见之后被操作系统调用,因此需要一个方法来重新初始化字段(在带有捕获异常的 try 结构中)。 这种情况不会导致在子节点关闭时调用 onStop()

当活动从后台恢复时,在没有 onStart()的情况下调用 onResume()

详情请访问 Android _ activity _ life Cycle _ got cha活动生命周期

onStart()表示 Activity进入可见状态并创建布局,但不能与此活动布局交互。

Resume()意味着现在您可以与活动布局进行交互。

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

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

OnResume () -> 在活动在前台时调用,或者用户可以与活动进行交互。

不知道这算不算一个答案——但是下面的 来自谷歌课程的 YouTube 视频(与 Kotlin 一起开发 Android 应用程序)解释了其中的区别。

  • 当活动变成 看得见时调用 On Start
  • 当活动 注意力不集中(像弹出对话框一样)调用 On Puse
  • 当活动 集中注意力调用 Resume 时(如对话框消失时)