我的应用程序遇到了一个问题,我有一个“option”类,其中包含一个ToggleButton,用于处理在 session 中创建的音乐播放(打开或关闭)。但是,如果我关闭音乐,切换屏幕并返回到选项类,则即使音乐不再播放,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;
}

}

选项类别:

公共(public)类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();
            }


        }});

}

}

主要 Activity 类
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"

谢谢你的帮助。

最佳答案

是的,当您返回此 View 时,ToggleButton将重新初始化,因此android:checked="true"重新开始起作用。

您可以使用myToggleButton.setChecked(boolean isMusicPlaying)方法来重置Button的状态。
因此,当您返回此 View 并相应设置按钮的状态时,必须检查音乐是否正在播放。

您可以使用method as described in another thread来确定您的音乐服务是否正在运行。

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)

关于android - Android:保存屏幕状态(初学者),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9823677/

10-10 08:30