大家好,并提前致谢(对不起我的英语),
我有几项使用多种音频功能的活动。为此,我在单例java类中有一个MediaPlayer,因此活动与该类交互,只存在一个媒体播放器。
其中一项功能是在X分钟后自动停止媒体播放器。所以我在单例类中创建了一个计时器,完全停止了无线电流。问题是没有反馈或回调正在运行的活动。有一个播放/停止按钮必须更改图像,我不知道如何捕获onStop事件或其他....或者可以从当前活动类运行的单个java类调用,所以我可以调用活动的功能,以改变图像?
最好的问候......
答案 0 :(得分:1)
你可能想要使用广播接收器。
从您停止播放音乐的单曲类中,调用此方法:
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();
}
答案 1 :(得分:1)
首先,感谢jameo的回答,听起来不错,但我不知道我是否有时间尝试,我保证如果我能在本周或下次有类似的问题,我会的。
最后我这样做了伎俩:
1 - 使用Method 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的回调必须使用Handler来完成:P
完美的工作:)。但我不知道这是一个非常糟糕的做法还是不是那么可怕xD
无论如何,谢谢Jameo。你的声音更优雅:P