首页 > 解决方案 > 绑定到已经运行的服务

问题描述

这是我的问题:我正在实现一个音乐播放器(PlayerActivity.java / xml),它绑定到一个服务(PlayerService.java),该服务基本上只是一个音乐播放器的实例,因此它可以在后台运行。当离开应用程序或更改活动并重新启动活动时,我想绑定到仍在运行的服务而不停止或重新启动它。我曾尝试仅使用 bindService() 但这让我遇到了问题:在 bindService 之前不调用 startService() ,服务不会被初始化或需要几毫秒,因此在访问服务函数时函数只会为空。这是我的服务类:

public class playerService extends Service {

    public boolean running = false;

    public MediaPlayer mediaPlayer;
    public boolean isPrepared = false;
    private String url;

    public class serviceBinder extends Binder {
        public playerService getService() {
            return playerService.this;
        }
    }

    public boolean isRunning(){
        return running;
    }

    private IBinder mBinder = new serviceBinder();

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.w("Service", "started");
        mediaPlayer = new MediaPlayer();
        running = true;
        Log.e("!!!", running + "");
        return START_STICKY;
    }

    public void pause() {
        mediaPlayer.pause();
    }

    public void resume() {
        mediaPlayer.start();
    }

    public void setupPlayer() {
        try {
            if (mediaPlayer != null) {
                mediaPlayer.reset();
            }
        } catch (Exception e) {
            Log.e("MediaPlayer", e.getMessage());
        }

        try {
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            Log.e("MediaPlayerToo", e.getMessage());
        }

    }

    public void reset(){
        mediaPlayer.reset();
    }

    public void updateUrl(String url){
        this.url = url;
    }

    public void start(){
        mediaPlayer.start();
    }

    public int getCurrentPosition(){
        return mediaPlayer.getCurrentPosition();
    }

    public int getDuration(){
        return mediaPlayer.getDuration();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        mediaPlayer.stop();
        mediaPlayer.reset();
    }

}

我尝试等待服务以布尔值启动。但是当我在之后添加任何类型的代码时

mService = binder.getService();
startService(intent);

它似乎根本没有被创建。

这也是我的 onServiceConnected 类

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            playerService.serviceBinder binder = (playerService.serviceBinder) service;
            Intent intent = new Intent(getApplicationContext(), playerService.class);
            mService = binder.getService();
            startService(intent);
            //... <- adding code here will result in the Service not starting?!!

        }

我知道我的问题很混乱,但这是我能想出的最好的解释。如果您有任何想法,我会非常高兴,因为这个问题阻止了我的部署。非常感谢!!

标签: javaandroidandroid-studioandroid-activityservice

解决方案


推荐阅读