Привязка к одному и тому же экземпляру службы в Android - PullRequest
2 голосов
/ 20 апреля 2011

Я играю с MediaPlayer. Я хочу, чтобы музыка играла, когда пользователь покидает активность. Однако, когда я ухожу и возвращаюсь к действию, похоже, что я не привязан к одному и тому же экземпляру.

Это мой код:

public class MusicService extends Service {
        private NotificationManager mNM;

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

        @Override
        public void onCreate() {

        }

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

        @Override
        public void onDestroy() {
            // Cancel the persistent notification.

            // Tell the user we stopped.
            Toast.makeText(this, "destroyed", Toast.LENGTH_SHORT).show();
        }

        @Override
        public IBinder onBind(Intent intent) {
            return mBinder;
        }

        // This is the object that receives interactions from clients.  See
        // RemoteService for a more complete example.
        private final IBinder mBinder = new LocalBinder();

        public void showtoast(int i){
            Toast.makeText(this, "showtoast"+i, Toast.LENGTH_SHORT).show();
        }

        //Music player functions


        String path = "http://mp3stream";
        MediaPlayer mp;
        Boolean mpLoaded=false;
        public void play(){
            if(!mpLoaded){
                try {
                    mp=new MediaPlayer();
                    mp.setDataSource(path);
                    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mp.prepareAsync();
                    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });
                    mpLoaded=true;
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public void pause(){
            if(mpLoaded){
                mp.stop();
                mpLoaded=false;
            }
        }
}

Это прекрасно работает, когда я не покидаю активность, но когда я делаю и музыка все еще играет, когда я возвращаюсь и нажимаю stop , ничего не происходит. Когда я нажимаю кнопку воспроизведения, запускается другой поток.

Отладчик показывает, что mpLoaded ложно, даже через сервис я слышу.

Вот как я это связываю.

private MusicService mBoundService;
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mBoundService = ((MusicService.LocalBinder)service).getService();
            mIsBound=true; 
            Toast.makeText(Main.this, "service connected", Toast.LENGTH_SHORT).show();
        }

        public void onServiceDisconnected(ComponentName className) {
            mBoundService = null;
            Toast.makeText(Main.this, "service disconnected", Toast.LENGTH_SHORT).show();
        }
    };

    void doBindService() {

        bindService(new Intent(getApplicationContext(), MusicService.class), mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }  

1 Ответ

3 голосов
/ 20 апреля 2011

Отвязываетесь ли вы от службы для обработчика завершающего события, такого как onStop вашей активности?Если это так, служба не связана и не уничтожена, и единственная причина, по которой вы все еще слышите музыку, заключается в том, что MediaPlayer все еще активен.При использовании связанных служб вы получаете новый экземпляр каждый раз, когда выполняете привязку, а затем отменяете привязку.

Если требуется постоянный экземпляр службы, используйте startService .Жизненный цикл службы не зависит от каких-либо обязательных действий, и вы можете вызвать stopService для завершения экземпляра службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...