0

いくつかのオーディオ機能を使用するいくつかのアクティビティがあります。そのために、私はシングルトンJavaクラスにMediaPlayerを持っているので、アクティビティはそのクラスと相互作用し、メディアプレーヤーにのみ存在します。

機能の1つは、X分後にメディアプレーヤーを自動的に停止することです。そこで、シングルトンクラスでタイマーを作成し、ラジオのストリーミングを完全に停止しました。問題は、実行中のアクティビティへのフィードバックやコールバックがないことです。画像を変更する必要のある再生/停止ボタンがあり、そのonStopイベントなどをキャプチャする方法がわかりません。または、現在実行中の単一のJavaクラスから呼び出すことができるので、呼び出すことができます。画像を変更するためのアクティビティの機能?

4

2 に答える 2

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();
}
于 2012-12-03T17:18:41.937 に答える
1

まず第一に、彼の答えに感謝します。かなり良さそうですが、試す時間があるかどうかはわかりません。今週または次回同様の問題が発生したときにできる場合は約束します。

最後に、私はこの方法でトリックを行いました:

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 - タイマーが実行されると、Activitie クラスの参照があるため、object_StoppedPlayerInterface.stoppedPlayer(); を呼び出すだけです。

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

最後に、私はそれをコーディングしませんでしたが、「UI スレッドのみが彼のビューに触れることができる」例外が必要ない場合は、アクティビティでの onStopMediaplayer へのコールバックをハンドラーで行う必要があります:P

それは完全に機能します:)。しかし、それが本当に悪い習慣なのか、それほどひどいものではないのかはわかりませんxD

とにかくありがとうジャメオ。あなたのサウンドははるかにエレガントです :P

于 2012-12-04T14:55:10.663 に答える