Сохранение музыкального состояния - PullRequest
1 голос
/ 27 марта 2012

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

В классе параметров у меня есть один ToggleButton, который включает и выключает музыку при нажатии, и я использовал логическое значение, чтобы определить, является ли ToggleButton автоматическим включением и выключением, в зависимости отиграет ли музыка.

Однако, когда пользователь нажимает кнопку «Назад» или кнопку «Сохранить» (которые оба отправляют их обратно на домашнюю страницу), музыка начинает воспроизводиться снова, даже если она отмечена как «выключенная».

У кого-нибудь есть предложения для меня?

Класс обслуживания:

public class MyMusicService extends Service {
MediaPlayer mp;


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mp = MediaPlayer.create(this, R.raw.song);


    mp.start();
    mp.setLooping(true);
    return super.onStartCommand(intent, flags, startId);
}


@Override
public IBinder onBind(Intent intent) {

    return null;
}


@Override
public void onDestroy() {

    super.onDestroy();
    if(mp!=null) {
        mp.stop();
        mp.release();

    }
    mp=null;
}

}

Опции класса:

public class OptionsActivity extends Activity {

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {

        if (keyCode == KeyEvent.KEYCODE_BACK ) {
            Intent i = new Intent(OptionsActivity.this, MainActivity.class);
            startActivity(i);
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

    private boolean isMyServiceRunning(String serviceCanonicalClassName) {
        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceCanonicalClassName.equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

    Intent i; // Handles MyMusicService.java

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.options);



        final TextView tSound = (TextView) findViewById(R.id.textView2);

        final Button saveBtn = (Button) findViewById(R.id.optSaveBtn);
        final Button tblBtn = (Button) findViewById(R.id.tableBtn);

        i=new Intent(this, MyMusicService.class);

        final ToggleButton soundOption = (ToggleButton) findViewById(R.id.soundPref);


        boolean musicPlays = isMyServiceRunning(MyMusicService.class.getCanonicalName());


        soundOption.setChecked(musicPlays); 


        if(musicPlays==true){

            tSound.setText("On");
        }

        if(musicPlays==false) { 

            tSound.setText("Off");
        }


        soundOption.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {   

                // Perform action on clicks to control sound being on and off.   
                if(soundOption.isChecked()) {  

                    Toast.makeText(OptionsActivity.this, "Music on.", Toast.LENGTH_SHORT).show(); 
                    startService(i);
                    Intent i = new Intent(OptionsActivity.this, OptionsActivity.class);
                    startActivity(i);

                } 

                else {  

                    if(stopService(i)==true){

                        soundOption.setChecked(false);
                        stopService(i);
                        Toast.makeText(OptionsActivity.this, "Music off.", Toast.LENGTH_SHORT).show();
                        Intent i = new Intent(OptionsActivity.this, OptionsActivity.class);
                        startActivity(i);

                    }  
                }
            }

        });



        tblBtn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Intent tblView = new Intent(OptionsActivity.this, SQLView.class);
                startActivity(tblView);

            }
        });



        saveBtn.setOnClickListener(new View.OnClickListener(){

            public void onClick(View v) {

                Intent homePage = new Intent(OptionsActivity.this, MainActivity.class);

                switch (v.getId()){ 

                case R.id.optSaveBtn: //Determine what will happen when the user presses the "Submit button".
                    boolean optionsWork = true;
                    try{

                        String sound = tSound.getText().toString();

                        optionsDB entry = new optionsDB(OptionsActivity.this); //Creating a new instance of MasterMind game
                        entry.open();
                        entry.createOptionEntry(sound); //Passing both strings
                        entry.close();

                    }catch (Exception e){ //Creating an error message if for some reason the app cannot transfer data to the Database.

                        Toast.makeText(OptionsActivity.this, "Error", Toast.LENGTH_SHORT).show();
                    }

                    finally { //Creating an AlertDialog box when the user presses the Submit button.

                        if (optionsWork){

                            Toast.makeText(OptionsActivity.this, "Settings Saved", Toast.LENGTH_SHORT).show();

                        }

                    }

                    break;

                }

                startActivity(homePage);
            }
        });
    }
}

И, наконец, домакласс:

public class MainActivity extends Activity {    

Intent i;

private boolean isMyServiceRunning(String serviceCanonicalClassName) {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceCanonicalClassName.equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}


public void checkSound(){

boolean musicPlays = isMyServiceRunning(MyMusicService.class.getCanonicalName());

    if(musicPlays==true){

        //Do nothing
    }
    else {

        stopService(i);

    }

}

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //setting the layout

    //Start Networking
    //Intent net = new Intent(this, Networking.class);
    //startService(net);

    //Auto starts playing music on app launch.
    i = new Intent(this,MyMusicService.class);
    startService(i);
    checkSound();


    final ImageView findGame = (ImageView) findViewById(R.id.btnFindGame);
    final ImageView profile = (ImageView) findViewById(R.id.btnProfile);
    final ImageView instructions = (ImageView) findViewById(R.id.btnInstructions);
    final ImageView options = (ImageView) findViewById(R.id.btnOptions);

    findGame.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, DrawActivity.class);
            startActivity(intent);
        }
    });

    profile.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, WaitingActivity.class);
            startActivity(intent);
        }
    });

    instructions.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, InstructionsActivity.class);
            startActivity(intent);
        }
    });

    options.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, OptionsActivity.class);
            startActivity(intent);
        }
    });

}

//On app close, music stops playing. 
@Override
protected void onDestroy() {
    if (this.isFinishing()){
        super.onDestroy();
        stopService(i);
        //finish();
    }
}
}

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Когда вы создаете домашний экран, вы также снова запускаете службу.В вашем «onStartCommand» службы вы запускаете медиаплеер.Это означает, что каждый раз, когда вы переходите на домашнюю страницу, медиаплеер начинает воспроизводиться снова.

Я бы рекомендовал не помещать mp.start(); в 'onStartCommand', а вместо этого в свою собственную функцию.Затем после вызова startService(i); вы можете связать службу с помощью bindService(), а затем вызвать функцию, например play (), с указателем службы, который у вас есть.

Конечно, если вы приостанавливаете песню вместоДля остановки вам потребуется сохранить положение песен, а затем использовать seekTo() для перемещения песни в нужное положение при перезапуске службы.

Я бы рекомендовал прочитать страницу службы Android здесь и здесь

0 голосов
/ 25 апреля 2012

Я думаю, вам нужно проверить некоторые службы запуска в вашем домашнем классе на методе создания,

    check if(your service is running)
       {
          if(mp is playing)
             {
                //do nothing
             }
       }
    else
       {
         startservice();
       }
...