2

我的应用程序遇到了问题,我有一个“选项”类,其中有一个 ToggleButton,用于处理我在 Session 中创建的音乐播放(打开或关闭)。但是,如果我关闭音乐,更改屏幕并返回选项类,即使音乐不再播放,ToggleButton 也会返回“on”,这意味着我必须按两次按钮才能播放音乐其实回来吧。有没有人有任何想法?

服务等级:

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 扩展 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(); 
            }  


        }});

}

}

MainActivity 类

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"

谢谢你的帮助。

4

1 回答 1

0

是的ToggleButton,当你回到这个视图时,将重新初始化,所以android:checked="true"重新开始发挥作用。

您可以使用该方法myToggleButton.setChecked(boolean isMusicPlaying)重置 Button 的状态。所以当你回到这个视图并相应地设置按钮的状态时,你必须检查音乐是否正在播放。


您可以使用另一个线程中描述的方法来确定您的音乐服务是否正在运行。

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)
于 2012-03-22T14:05:42.953 回答