0

我正在尝试为一个项目制作一个简单的 mp3 播放器应用程序,但我无法从主要活动中访问该服务。我在活动中有一些 onclicklisteners:

play.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PlayService.class);
            intent.putExtra("key", 0);
            startService(intent);               
        }
    });

    pause.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PlayService.class);
            intent.putExtra("key", 1);
            startService(intent);
        }
    });

    stop.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PlayService.class);
            intent.putExtra("key", 2);              
        }
    });

以及响应 onclicks 的服务中的 switch 语句:

@Override
public int onStartCommand(Intent intent, int flags, int startId){

    int key = intent.getIntExtra("key", 1);
    MediaPlayer mMediaPlayer = new MediaPlayer();

    FileInputStream fileStream = null;
    try {
        fileStream = new FileInputStream("/sdcard/Download/Bob_Marley-Jammin.mp3");
    }
    catch (FileNotFoundException e1) {
            e1.printStackTrace();
    }

    switch (key) {
    case 0: //Play
        if (mMediaPlayer.isPlaying()){
            break;
        }
        else
            try {
                mMediaPlayer.setDataSource(fileStream.getFD());
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                mMediaPlayer.prepare();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mMediaPlayer.start();
        break;
    case 1: //Pause
            mMediaPlayer.pause();
        break;
    case 2: //Stop
        if(mMediaPlayer.isPlaying()){
            mMediaPlayer.pause();
            mMediaPlayer.seekTo(0);
        }
        break;
    default:
        break;
    }   

    return Service.START_NOT_STICKY;
}

由于某种原因,播放调用有效,但暂停和停止调用无效。我认为这可能是因为我每次调用服务时都会创建一个新的 MediaPlayer 引用。(我不知道如何解决这个问题)

所以我听说通过将其设置为单例类并从活动中访问它更容易访问该服务,但我不确定如何实现它。基于我的代码的任何提示?

4

2 回答 2

0

播放按钮中的 startService 会启动您的服务。每次单击下一步按钮都会尝试再次启动服务,但没有任何效果。您必须绑定到服务,并在您的活动和服务之间建立通信,以便停止和暂停工作。把“玩”也放在一个电话里。这里有关于活动和服务之间的通信如何工作的很好的文档:http: //developer.android.com/reference/android/app/Service.html

于 2012-06-13T02:15:21.177 回答
0

不能初始化 Service(使用构造函数,或者调用 getInstance 方法),所以不能使用单例类。
解决方案是您可以在活动和服务之间进行通信。这是一个 示例:使用消息传递在 Activity 和服务之间进行通信
查看 android 文档中的本地服务示例:http: //developer.android.com/reference/android/app/Service.html

于 2012-06-13T02:22:18.383 回答