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

我无法得到onStart()过渡状态的含义。 onResume()方法总是在onStart()之后onStart() 。 为什么不能在onRestart()onCreate()方法之后调用onResume() onStart()呢? 它的目的是什么?

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

为什么不能在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()方法之后调用onResume(),onStart()呢?

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

简短的回答:

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

另外onRestart()是最不理解的一个。 我们可以问这个问题,为什么不直接去onStart()或onResume()onStop()而不是onRestart()。 如果我们注意到,如果省略了创build部分,则onRestart()部分地等同于onCreate(),这变得更容易理解。 基本上这两个国家导致onStart()(即活动变得可见)。 所以这两个州必须“准备”要显示的东西。 OnCreate有额外的责任来“创build”要显示的东西

所以他们的代码结构可能适合类似于:

 onCreate() { createNecessaryObjects(); prepareObjectsForDisplay(); } onRestart() { prepareObjectsForDisplay(); } 

由于Googleselect了非直观的名称,而不是如下所示,导致了整个混淆:

 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活动生命周期

onStart()在活动对用户可见时调用。 当活动将开始与用户交互时调用onResume() 。 在这种情况下你可能想做不同的事情。

请参阅此链接以供参考。

onResume()被调用:

  1. onStart()
  2. Activity来到前台。

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle替代文字

本书“Hello,Android,介绍Google的移动开发平台”为Android应用程序的生命周期提供了一个很好的解释。 幸运的是,他们将网上的特定章节作为摘录。 请参阅http://media.pragprog.com/titles/eband3/concepts.pdf上第; 39页的图片

顺便说一下,这本书是非常值得推荐的Android初学者!

一个特别引人注目的例子是当你决定使用showDialog()从一个活动显示一个托pipe的对话框。 如果用户在对话框仍然打开的情况下旋转屏幕(我们称之为“configuration改变”),那么主Activity将经历所有结束的生命周期调用,直到onDestroy() ,将被重新创build,并且通过生命周期。 然而,你可能不会期望的是, onCreateDialog()onPrepareDialog() (当你做showDialog()时调用的方法,现在再次自动重新创build对话框 – 自动,因为它是一个托pipe对话框) onStart()onResume() 。 这里最重要的是对话框没有覆盖整个屏幕,因此可以看到主要活动的一部分。 这是一个细节,但它确实很重要!

onStart()

  1. 在onCreate(Bundle)之后或onRestart()之后调用onResume()之后调用。
  2. 您可以在onStart()注册BroadcastReceiver来监视影响您的UI的更改,您必须在onStop()中取消注册
  3. 派生类必须调用超类的这个方法的实现。 如果他们不这样做,就会抛出exception。

onResume()

  1. 调用onRestoreInstanceState(Bundle),onRestart()或onPause()
  2. 开始animation,打开独占访问设备(如相机)

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

  • 如果遇害, START_STICKY会自动重新启动,以保持活动状态。

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

设备进入睡眠状态后,或在警报或其他部分屏幕的子活动使一部分前一个窗口可见时,操作系统会调用onResume()方法,因此需要重新初始化字段(在try结构中使用捕获例外)。 这种情况不会导致onStop()在子closures时被调用。

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

有关更多详细信息,您可以访问Android_activity_lifecycle_gotcha和活动生命周期

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

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

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

如果您正在使用SINGLE_TOP标志,并且使用intent extras将一些数据发送到您的活动,则只能在onStart()之后和onResume() 之前调用onNewIntent()来访问它。 所以通常情况下,您将从extras中获取新的(也许只是修改的)数据,并将其设置为某些类成员,或者使用setIntent()将新的intent设置为原始活动意图并在onResume()中处理数据。

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

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

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