我有几个使用多种音频功能的活动。为此,我在单例 java 类中有一个 MediaPlayer,因此活动与该类交互并且只存在于媒体播放器上。
其中一项功能是在 X 分钟后自动停止媒体播放器。所以我在单例类中创建了一个计时器,并完美地停止了无线电流。问题是正在运行的活动没有反馈或回调。有一个播放/停止按钮必须更改图像,我不知道如何捕获该 onStop 事件或其他什么......或者可以从当前正在运行的活动类的单个 java 类中调用,所以我可以调用活动的功能以更改图像?
我有几个使用多种音频功能的活动。为此,我在单例 java 类中有一个 MediaPlayer,因此活动与该类交互并且只存在于媒体播放器上。
其中一项功能是在 X 分钟后自动停止媒体播放器。所以我在单例类中创建了一个计时器,并完美地停止了无线电流。问题是正在运行的活动没有反馈或回调。有一个播放/停止按钮必须更改图像,我不知道如何捕获该 onStop 事件或其他什么......或者可以从当前正在运行的活动类的单个 java 类中调用,所以我可以调用活动的功能以更改图像?
您可能想为此使用广播接收器。
从执行停止的 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();
}
首先,感谢 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