Android: сохранение состояния экрана (для начинающих) - PullRequest
2 голосов
/ 22 марта 2012

Я столкнулся с проблемой с моим приложением, у меня есть класс "option", в котором есть 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() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if(mp!=null) {
        mp.stop();
        mp.release();
    }
    mp=null;
}

}

Класс опции:

открытый класс OptionsActivity extends Activity {

Intent i; // Handles MyMusicService.java
protected void onCreate(Bundle savedInstanceState) {

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

    i=new Intent(this, MyMusicService.class);
    final ToggleButton soundOption = (ToggleButton) findViewById(R.id.soundPref);

    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);  
            } else {   
                stopService(i);
                Toast.makeText(OptionsActivity.this, "Music off.", Toast.LENGTH_SHORT).show(); 
            }  


        }});

}

}

MainActvitiy class

Intent i;

protected void onCreate(Bundle savedInstanceState) {

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

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

Может ли это быть как-то связано с тем фактом в XML, который у меня есть:

android:checked="true"

Спасибо за любыепомощь.

1 Ответ

0 голосов
/ 22 марта 2012

Да, ToggleButton будет инициализирован заново, когда вы вернетесь к этому виду, поэтому android:checked="true" вернется в игру.

Вы можете использовать метод myToggleButton.setChecked(boolean isMusicPlaying) для сброса состояния кнопки. Поэтому вы должны проверить, играет ли музыка или нет, когда вы вернетесь к этому виду и соответственно установите состояние кнопки.


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

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;
}

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

boolean musicPlays = isMyServiceRunning(MyMusicService.class.getCanonicalName());
final ToggleButton soundOption = (ToggleButton) findViewById(R.id.soundPref);
soundOption.setChecked(musicPlays)
...