3 回答
TA贡献1825条经验 获得超6个赞
为什么不能仅将onStart()排除在onRestart()和onCreate()方法之后调用onResume()?目的是什么?
好的,因为我的第一个答案很长,所以我不会进一步扩展它,所以让我们尝试一下...
public DriveToWorkActivity extends Activity
implements onReachedGroceryStoreListener {
}
public GroceryStoreActivity extends Activity {}
请注意:我故意省略了对诸如super.onCreate(...)etc之类的调用。这是伪代码,因此请在此处给我一些艺术许可。;)
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()的越多,我做的事情就越多。
因此,再次报价...
为什么不能仅将onStart()排除在onRestart()和onCreate()方法之后调用onResume()?
如果您不重写,onStart()则实际上是发生的情况。尽管的onStart()方法Activity将被隐式调用,但是代码中的效果实际上是onCreate() -> onResume()或onRestart() -> onResume()。
TA贡献1876条经验 获得超7个赞
简短答案:
我们不能没有onStart,因为那是活动对用户“可见”的状态,但是用户不能与其进行“交互”,但是可能会导致它与其他一些小对话框重叠。这种与用户交互的能力是区分onStart和onResume的能力。可以将其视为玻璃门后面的人。您可以看到此人,但不能与他互动(交谈/聆听/握手)。OnResume就像开门器,之后您就可以开始交互。
另外,对onRestart()的了解最少。我们可以问一个问题,为什么不直接在onStop()之后而不是onRestart()之后转到onStart()或onResume()。如果我们注意到如果省略了创建部分,则onRestart()部分等效于onCreate()会更容易理解。基本上,这两种状态都导致onStart()(即,活动变为可见)。因此,这两种状态都必须“准备”要显示的内容。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]
TA贡献1772条经验 获得超5个赞
onStart()
在onCreate(Bundle)之后或onRestart()之后,再在onResume()之后调用 。
您可以注册一个BroadcastReceiver onStart()来监视影响您的UI的更改,您必须在onStop()中注销它
派生类必须调用此方法的超类的实现。如果不这样做,将引发异常。
onResume()
在onRestoreInstanceState(Bundle),onRestart()或onPause()之后调用
开始制作动画,打开专有访问设备(例如相机)
onStart() 通常将工作分派到后台线程,该后台线程的返回值为:
START_STICKY如果被杀死将自动重新启动,以使其保持活动状态。
START_REDELIVER_INTENT 自动重启,如果服务在stopSelf()之前被终止,则重试。
onResume()在设备进入睡眠状态或警报或其他部分屏幕子活动使之前的窗口的一部分可见后,由操作系统调用,因此需要一种方法来重新初始化字段(在带有异常捕获的try结构中) )。onStop()当孩子关闭时,不会导致这种情况。
onResume()onStart()活动从后台恢复时不调用
有关更多详细信息,您可以访问Android_activity_lifecycle_gotcha和活动生命周期
- 3 回答
- 0 关注
- 1006 浏览
添加回答
举报