我正在尝试了解Android Activity的生命周期。为此,我创建了Activity,我已经覆盖了所有生命周期方法(onCreate,onStart,onRestart,onResume,onPause,onStop,onDestroy):
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.d("ActivityTutorial", "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d("ActivityTutorial", "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("ActivityTutorial", "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d("ActivityTutorial", "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("ActivityTutorial", "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d("ActivityTutorial", "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("ActivityTutorial", "onDestroy");
}
}
我在使用Log.d(...)记录的行上放置了断点。然后我试着调试。 onCreate方法没问题 - 它是在创建活动时调用的。
奇怪的情况是从Start方法开始。根据Android documentation:“onStart()在活动变得对用户可见时调用。”但是当我调试时,它涉及到onStart方法,但是这个Activity上的Button,还不可见。
我认为在调用onStart()方法后应该在onResume()上看到它。但按钮不可见。
仅在onResume方法之后,按钮才可见。
所以我的问题是onStart和onResume方法有什么问题?也许我做的事情不是以它应该做的方式做的?
答案 0 :(得分:1)
首先,当第一次进入活动时,视图不会添加到位于onStart
和onResume
的窗口中。 addView
到在onResume
方法之后调用的窗口。您可以看到ActivityThread handleResumeActivity
方法。
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) {
// it will call activity onResume in the end
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
...
if (r.activity.mVisibleFromClient) {
r.activity.makeVisible();
}
...
}
// this is the activity method,it will add view to window, and show
void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
wm.addView(mDecor, getWindow().getAttributes());
mWindowAdded = true;
}
mDecor.setVisibility(View.VISIBLE);
}
因此,正如文档所说,onResume并不是最好的指标
请记住,onResume并不是最好的指示,表明用户可以看到您的活动;系统窗口(例如键盘锁)可能在前面。使用onWindowFocusChanged(boolean)可以确定您的活动对用户可见(例如,恢复游戏)。
因此,如果您要确认活动可见,请使用onWindowFocusChanged
。
此后,我们按Home
键,然后再次打开活动,这一次onStart
方法可以看到用户界面可见。
那是真正的原因。
答案 1 :(得分:0)
没有。 onResume()方法使Activity可见。正如您所说,感谢文档:" onStart()当活动变得可见时调用
;如果你仔细阅读:" onResume()当活动开始与用户交互时调用。"
<强>更新强>
请记住,onResume不是您的最佳指标 活动对用户可见;一个系统窗口,如键盘锁 可能在前面。使用onWindowFocusChanged(boolean)来确定 您的活动对用户可见(例如,恢复 游戏)。
答案 2 :(得分:0)
井活动将在onResume()方法上显示,而不在onStart()上。看到android文档和活动生命周期。
答案 3 :(得分:0)
onStart()方法在Activity Lifecycle中的主要原因是为用户准备好主UI空间。它掌握了onCreate()方法中为UI分配的值,以及就绪活动UI对用户可见。
第二个原因是每次onStop()方法调用时我们都不必创建活动。它就像活动生命周期中的一个检查点,可以在不进行额外加载的情况下返回到以前的状态。
现在onStart()方法非常快速地加载并启动onResume()方法。 onResume()允许用户与UI进行交互。但正如你所说,在加载onResune()方法之后你的UI很少,因为onStart()方法无法访问不可访问的UI。如果用户尝试访问无法访问的用户界面但无法执行任何操作,则会显示不良印象。因此,只有当UI可访问并准备好进行用户交互时,UI才会显示。