Как сделать включение и выключение фоновой музыки в мобильной игре (или приложении)?

Пишу мобильную игру

Есть класс, через который реализуется включение музыки в фоновом режиме:

    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.Toast;
    public class MyService extends Service {
        private static final String TAG = "MyService";
        static MediaPlayer player;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    
            player = MediaPlayer.create(this, R.raw.sound);
            player.setLooping(true); // зацикливаем
        }
    
        @Override
        public void onDestroy() {
            Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
            player.stop();
        }
    
        @Override
        public void onStart(Intent intent, int startid) {
            Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
            player.start();
        }
    }

В активности обращение к этому классу и вызов класса, унаследованного от View (об этом ниже) происходит следующим образом:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        GameView gameView = new GameView(this); // создаём gameView
        LinearLayout gameLayout = (LinearLayout) findViewById(R.id.gameLayout); // находим gameLayout
        gameLayout.addView(gameView); // и добавляем в него gameView

...

        startService(new Intent(this, MyService.class)); // обращение к классу MyService

        }

Весь игровой процесс происходит в классе, унаследованном от View (это важно). Этот класс также запускается из активности. Включение и выключение музыки в этом классе реализовано так:

               if (soundOn){
                    soundOn = false;
                    MyService.player.stop(); // выключение музыки
                }
                else {
                    soundOn = true;
                    MyService.player.start();

И выключается музыка вполне успешно, а вот включить её обратно уже не получается. Подскажите, пожалуйста, что как это исправить.

P.S. Не обязательно использовать приведённый мной код, главное, чтобы музыка играла на фоне игрового процесса и её можно было бы включить и выключить.


Ответы (1 шт):

Автор решения: Style-7

Не хотел я это выкладывать из-за "некрасивых" статических объектов, но раз автор вопроса попросил, а на практике все работает отлично в нескольких проектах, то пожалуйста.

public class GameSound {
    static SoundPool sp;
    static int drop_on_field;
    static int drop_on_screen;
    static int take;
    static int complete;
    static MediaPlayer media_player;

    static void Init( Context context){
        sp = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
        drop_on_field = sp.load(context, R.raw.drop_on_field, 1);
        take = sp.load(context, R.raw.take, 1);
        drop_on_screen = sp.load(context, R.raw.drop_on_screen, 1);
        complete = sp.load(context, R.raw.complete, 1);
        media_player = MediaPlayer.create(context, R.raw.music);
        media_player.setLooping(true);
    }

    static void PlaySound( int id){
        if( Options.sound  ){
            sp.play( id, 1, 1, 0, 0, 1);
        }
    }

    static void onResume(){
        if( GameSound.media_player != null && Options.music){
            GameSound.media_player.start();
        }
    }


    static void onPause(){
        if( GameSound.media_player != null && GameSound.media_player.isPlaying()){
            GameSound.media_player.pause();
        }
    }
}

Далее, во всех активностях игры, где будет звучать фоновая музыка добавляем:

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

@Override
protected void onPause(){
    super.onPause();
    GameSound.onPause();
}
→ Ссылка