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
开始(强制我的DriveToWorkActivity
的onStop()
)点。 当我从商店回来时,我经历了onRestart()
和onStart()
然后恢复我的旅程。
我可以把onStart()
的代码放到onCreate()
和onRestart()
而不用麻烦重写onStart()
,但是onCreate() -> onResume()
和onRestart() -> onResume()
,我正在复制的东西越多。
所以,再次重新…
为什么不能在onRestart()和onCreate()方法之后调用onResume(),onStart()呢?
如果你不覆盖onStart()
那么这实际上是发生了什么。 虽然Activity
的onStart()
方法将被隐式调用,但是您的代码中的效果实际上是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]
活动图可能被解释为:
onStart()
在活动对用户可见时调用。 当活动将开始与用户交互时调用onResume()
。 在这种情况下你可能想做不同的事情。
请参阅此链接以供参考。
onResume()
被调用:
-
onStart()
- 当
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()
- 在onCreate(Bundle)之后或onRestart()之后调用onResume()之后调用。
- 您可以在
onStart()
注册BroadcastReceiver来监视影响您的UI的更改,您必须在onStop()中取消注册 - 派生类必须调用超类的这个方法的实现。 如果他们不这样做,就会抛出exception。
onResume()
- 调用onRestoreInstanceState(Bundle),onRestart()或onPause()
- 开始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()
跟随。