Reproduzca video en segundo plano usando mediaplayer en servicio

Estoy desarrollando una aplicación que puede reproducir videos de YouTube, si el usuario presionó el botón de inicio, el usuario puede escuchar el audio y luego puede volver a ver el video nuevamente. Por lo tanto, uso Mediaplayer y configuroDisplay SurfaceView para ver video, pero no puede mantener la reproducción del reproductor cuando se presiona en casa, sé que el Servicio puede realizar operaciones de larga duración en segundo plano y no proporciona una interfaz de usuario. entonces, creo un servicio que contiene Mediaplayer

public class VideoPlayerService extends Service implements MediaPlayer.OnPreparedListener {

    private static final String TAG = "VideoPlayerService";

    public MediaPlayer mPlayer;

    public static int position;

    private final IBinder mBinder = new LocalBinder();

    @Override
    public IBinder onBind(Intent intent) {
       Log.d(TAG, "service in onBind");
       return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mPlayer = new MediaPlayer();
        Log.d(TAG, "service created");
    }

    public class LocalBinder extends Binder {
        public VideoPlayerService getService() {
            return VideoPlayerService.this;
        }
    }

    @Override
    public int onStartCommand(final Intent intent, final int flags, final int startId) {
        return 1;
    }


    public IBinder onUnBind(final Intent arg0) {
        return null;
    }
}

Y mi actividad se vincula para obtener una instancia de servicio y obtener una instancia de mediaplayer parasetDisplay vista de superficie a ella. Pero parece que puedosetDisplay al mediaplayer porque la instancia de servicio no regresa antes de que mi actividad se vayaonCreate() de acuerdo con estoandroid-how-do-i-wait-until-a-service-is-realmente-conectado

pero superficie creada inmediatamente con actividad, y no puedosetDisplay al mediaplayer para mostrar el video, ¿cómo puedo superar este problema? Aquí está mi actividad:

public class VideoPlayerActivity extends Activity implements SurfaceHolder.Callback, MediaController.MediaPlayerControl, GetStreamUrlTest.IPlayerListener, MediaPlayer.OnPreparedListener {

static final String TAG = "VideoPlayerActivity";

public MediaController mMediaController;

public SurfaceView surfaceView;
public SurfaceHolder holder;

public VideoItem mVideoItem;

public int position = 0;

private VideoPlayerService mVideoPlayerService;

private boolean mBounded;

private ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        VideoPlayerService.LocalBinder localBinder = (VideoPlayerService.LocalBinder)
                iBinder;
        mVideoPlayerService = localBinder.getService();
        mBounded = true;
        Log.d(TAG, "Service connected");

    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.e(TAG, "Service has unexpectedly disconnected");
        mBounded = false;
    }
};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.videoplayer);

    Log.d(TAG, "in Oncreate");

    mMediaController = new MediaController(this);
    mMediaController.setMediaPlayer(this);
    mMediaController.setAnchorView(surfaceView);

    Intent intent = getIntent();
    mVideoItem = (VideoItem) intent.getParcelableExtra(ConstantFields.VIDEO_ITEM);

    getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
    holder = surfaceView.getHolder();
    holder.setFixedSize(800, 480);
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
protected void onStart() {
    super.onStart();
    Intent serviceIntent = new Intent(this, VideoPlayerService.class);
    bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onResume() {
    super.onResume();

}

@Override
protected void onStop() {
    super.onStop();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!mMediaController.isShowing()){
        mMediaController.show();
    } else {
        mMediaController.hide();
    }
    return false;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
}

@Override
protected void onPause() {
    super.onPause();
}

@Override
protected void onDestroy() {
    super.onDestroy();
}

@Override
public void doPlayVideo(VideoItem videoItem){
    Log.d(TAG,"in DO Play");
    mVideoPlayerService.mPlayer.reset();
    try {
        mVideoPlayerService.mPlayer.setDataSource(this, Uri.parse(videoItem.getStreamUrl()));

        mVideoPlayerService.mPlayer.prepareAsync();
        mVideoPlayerService.mPlayer.setOnPreparedListener(this);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    mVideoPlayerService.mPlayer.start();
}

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
    mVideoPlayerService.mPlayer.setDisplay(surfaceHolder);
    doPlay(mVideoItem)
    Log.d(TAG, "In surface Created");
}

@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
}

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta