在Android中制作单例类

时间:2012-06-13 02:06:32

标签: android service singleton

我正在尝试为一个项目制作一个简单的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);              
        }
    });

和我的服务中的switch语句响应onclicks:

@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引用。 (我不知道如何解决这个问题)

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你不能初始化Service(使用构造函数,或调用getInstance方法),所以你不能使用singleton类。
解决方案是您可以在您的活动和服务之间进行通信。 这是一个Example: Communication between Activity and Service using Messaging
在Android doc中查看本地服务示例:http://developer.android.com/reference/android/app/Service.html