Android - onStart方法有什么问题?

时间:2015-10-05 09:27:31

标签: android android-activity

我正在尝试了解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,还不可见。

enter image description here

我认为在调用onStart()方法后应该在onResume()上看到它。但按钮不可见。

enter image description here

仅在onResume方法之后,按钮才可见。

enter image description here

所以我的问题是onStart和onResume方法有什么问题?也许我做的事情不是以它应该做的方式做的?

4 个答案:

答案 0 :(得分:1)

首先,当第一次进入活动时,视图不会添加到位于onStartonResume的窗口中。 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才会显示。