public void startRenderer(int delayMillis) {
        delayMillis = Math.max(0, delayMillis);
        /*gets the device configuration attributes from the activity manager*/
        configurationInfo = ((ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE)).getDeviceConfigurationInfo();
        glEsVersion = "GL_ES Version : " + configurationInfo.getGlEsVersion();
        /*sanity check the app instance*/
        if (legacyApplication == null) {
            throw new IllegalStateException("Cannot build a SurfaceView for a null app, make sure to use setLegacyApplication() to pass in your app !");
        }
        /*initialize App Settings and start the Game*/
        appSettings = new AppSettings(true);
        appSettings.setAudioRenderer(audioRendererType);
        appSettings.setResolution(JmeSurfaceView.this.getLayoutParams().width, JmeSurfaceView.this.getLayoutParams().height);
        appSettings.setAlphaBits(eglAlphaBits);
        appSettings.setDepthBits(eglDepthBits);
        appSettings.setSamples(eglSamples);
        appSettings.setStencilBits(eglStencilBits);
        appSettings.setBitsPerPixel(eglBitsPerPixel);
        appSettings.setEmulateKeyboard(emulateKeyBoard);
        appSettings.setEmulateMouse(emulateMouse);
        appSettings.setUseJoysticks(useJoyStickEvents);
        /*fetch and sanity check the static memory*/
        if (GameState.getLegacyApplication() != null) {
            this.legacyApplication = GameState.getLegacyApplication();
            jmeSurfaceViewLogger.log(Level.INFO, "Old game state has been assigned as the current game state, skipping the first update");
        } else {
            legacyApplication.setSettings(appSettings);
            jmeSurfaceViewLogger.log(Level.INFO, "Starting a new Game State");
            /*start jme game context*/
            legacyApplication.start();
            /*fire the onStart() listener*/
            if (onRendererStarted != null) {
                onRendererStarted.onRenderStart(legacyApplication, this);
            }
        }
        /*attach the game to JmE OpenGL.Renderer context*/
        oglesContext = (OGLESContext) legacyApplication.getContext();
        /*create a glSurfaceView that will hold the renderer thread*/
        glSurfaceView = oglesContext.createView(JmeSurfaceView.this.getContext());
        /*set the current view as the system engine thread view for future uses*/
        JmeAndroidSystem.setView(JmeSurfaceView.this);
        /*set JME system Listener to initialize game, update, requestClose and destroy on closure*/
        oglesContext.setSystemListener(JmeSurfaceView.this);
        /*set the glSurfaceView to fit the widget*/
        glSurfaceView.setLayoutParams(new LayoutParams(JmeSurfaceView.this.getLayoutParams().width, JmeSurfaceView.this.getLayoutParams().height));
        if (GameState.getLegacyApplication() != null) {
            addGlSurfaceView();
        } else {
            /*post delay the attachment of the surface view on the UI*/
            handler.postDelayed(rendererThread, delayMillis);
        }
    }
Starts the jmeRenderer on a GlSurfaceView attached to a RelativeLayout.

@param delayMillis delays the attachment of the surface view to the UI (RelativeLayout).
jme3-android/src/main/java/com/jme3/view/surfaceview/JmeSurfaceView.java