我无法理解onStart()
过渡状态的含义。始终在onResume()
之后调用onStart()
方法。为什么不能在onResume()
和onRestart()
方法之后调用onCreate()
来排除onStart()
?它的目的是什么?
为什么我们不能没有onStart()
。我仍然认为它是多余的(可能是因为完全不理解它的含义)。
答案 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
已启动(迫使我的DriveToWorkActivity
到onStop()
点)。当我从商店返回时,我会经过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]
活动图可能被解释为:
答案 2 :(得分:26)
onStart()
被调用。
当活动开始与用户交互时调用onResume()
。
在这种情况下,您可能想要做不同的事情。
请参阅this link以供参考。
答案 3 :(得分:16)
onResume()
被称为:
onStart()
Activity
到达前台时。来自http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle:
答案 4 :(得分:9)
答案 5 :(得分:7)
一个特别鲜明的例子是当您决定使用showDialog()
从活动中显示托管对话框时。如果用户在对话框仍然打开时旋转屏幕(我们称之为“配置更改”),那么主Activity将经历所有结束生命周期调用,直到onDestroy()
,将重新创建,然后返回通过生命周期。但是,您可能没有想到的是onCreateDialog()
和onPrepareDialog()
(当您执行showDialog()
时调用的方法,现在再次自动重新创建对话框) - 因为它是托管对话框)在 onStart()
和onResume()
之间被称为。这里的pointe是对话框没有覆盖整个屏幕,因此可以看到主要活动的一部分。这是一个细节,但它确实很重要!
答案 6 :(得分:7)
onStart()
onStart()
中注册BroadcastReceiver以监控更改
这会影响您的UI,您必须在onStop() <强> onResume()
强>
onStart()
通常会将工作分派给后台线程,后台线程的返回值为:
START_STICKY 如果被杀,则自动重启,以使其保持活动状态。
START_REDELIVER_INTENT
用于自动重启,如果服务在stopSelf()之前被杀死则重试。
onResume()
,因此需要一种方法重新初始化字段(在具有异常捕获的try结构中)。
当孩子关闭时,这种情况不会导致onStop()
被调用。
onResume()
在没有 onStart()
的情况下被调用有关详细信息,您可以访问Android_activity_lifecycle_gotcha和Activity 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应用程序)解释的区别。