0

我有几个使用多种音频功能的活动。为此,我在单例 java 类中有一个 MediaPlayer,因此活动与该类交互并且只存在于媒体播放器上。

其中一项功能是在 X 分钟后自动停止媒体播放器。所以我在单例类中创建了一个计时器,并完美地停止了无线电流。问题是正在运行的活动没有反馈或回调。有一个播放/停止按钮必须更改图像,我不知道如何捕获该 onStop 事件或其他什么......或者可以从当前正在运行的活动类的单个 java 类中调用,所以我可以调用活动的功能以更改图像?

4

2 回答 2

1

您可能想为此使用广播接收器。

从执行停止的 singlton 类中,当您的计时器停止音乐时,调用此方法:

public void broadcastMusicPaused(View v){
    Intent broadcast = new Intent();
    broadcast.setAction("MUSIC_STOPPED");
    sendBroadcast(broadcast);
}

然后,从您的控制活动中,像这样设置您的接收器:

private BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "Music Paused", Toast.LENGTH_SHORT).show();
        displayMusicStopped();       //switches images
    }
};

@Override
protected void onResume() {
    IntentFilter filter = new IntentFilter();
    filter.addAction("MUSIC_STOPPED");
    registerReceiver(receiver, filter);

    super.onResume();
}

@Override
protected void onPause() {
    unregisterReceiver(receiver);
    super.onPause();
}
于 2012-12-03T17:18:41.937 回答
1

首先,感谢 jameo 的回答,听起来不错,但我不知道我是否有时间尝试,我保证我会在本周或下一次有类似问题的情况下尝试。

最后我这样做了:

1 - 使用方法 onStopMediaPlayer() 创建一个接口;//例如调用MediaPlayerStopInterface

public interface MediaPlayerStopInterface {
    /**
     * Called when the player timer ends 
     */
  public void onStopMediaPlayer();
}

2 - 我的活动类实现了界面切换图像。

public class PortadaActivity extends Activity implements MediaPlayerStopInterface{
    public void onStopMediaPlayer(){
        //Switch images or whatever
    }
}

3 - 我的单例类有一个接口类型为 MediaPlayerStopInterface 的对象

public class AudioControllerClass {   //The Singletton Java Class
    private MediaPlayerStopInterface currentActivity;

    public void setCurrentActivity(MediaPlayerStopInterface mpsi){
    currentActivity=mpsi;
}
}

4 - 我在 onResume() 中的活动类执行 Singlettonclass.setStoppedPlayerInterface(this),所以我总是有正在运行的活动的参考。

public class PortadaActivity extends Activity implements MediaPlayerStopInterface{
    public void onResume() {
        AudioControllerClass.getInstance(getApplicationContext()).setCurrentActivity(this); //In every resume the singletton class knows who was the last one in being active
    }
}

5 - 当计时器执行时,因为我有活动类引用,我只是调用 object_StoppedPlayerInterface.stoppedPlayer();

public class AudioControllerClass {   //The Singletton Java Class
    class TimerRadio extends TimerTask {
        public void run() {
            if(whatever==true){
                currentActivity.onStopMediaPlayer();
            }
        }
    }
}

最后,我没有编写代码,但活动中对 onStopMediaplayer 的回调必须使用处理程序完成,如果您不想要“只有 UI 线程可以触摸他的视图”异常:P

它完美地工作:)。但我不知道这是一个非常糟糕的做法还是不是那么可怕 xD

无论如何,感谢 Jameo。你的听起来更优雅:P

于 2012-12-04T14:55:10.663 回答