0

私のアプリは、MediaPlayer オブジェクトを使用してバックグラウンド ミュージックを再生します。名前付きの他のグローバル変数と一緒に.javaファイルに保存します-他に何がありますか? - GlobalVariables と他の変数にアクセスするには、次の呼び出しを使用します。

GlobalVariables.mPlayer

アプリでアクティビティを切り替えるときに MediaPlayer にオーディオ再生を継続させたいのですが、アプリがフォーカスを失ったときに一時停止します。これを実現するために、keepPlaying というブール値を宣言しました。この値も GlobalVariables に格納され、アプリ内のすべてのアクティビティからアクセスできるようになっています。onStop() が呼び出されるたびにアクティビティにブール値フラグをチェックさせ、keepPlaying = false の場合は再生を一時停止し、そうでない場合は何もしません (再生を続けます)。各 startActivity() 呼び出しの直前にフラグを true に設定し、すべての onResume() 呼び出しで false に設定します。

アクティビティのライフサイクルを正しく理解していれば、アクティビティを切り替えるときに、アプリは最初に現在のアクティビティで OnStop() を呼び出します。最初に keepPlaying を true に設定し、次に onStop() を呼び出します。メソッドには次の 3 行が含まれます。

super.onStop();
if(GlobalVariables.keepPlaying == false)
    GlobalVariables.mPlayer.pause();

そのため、startActivity 呼び出しを行うたびに再生を継続する必要がありますが、アプリを最小化すると再生を一時停止します。次に、次のアクティビティの onResume() メソッドで、フラグを false に設定します。

if(GlobalVariables.keepPlaying == true){
    GlobalVariables.keepPlaying = false;
}else{
    GlobalVariables.mPlayer.start();

しかし、アプリは私が望むように動作していません。アクティビティを切り替えると、オーディオの再生が一時停止します。keepPlaying フラグの getter メソッドと setter メソッドを作成しようとしましたが、それでも修正されていないため、アクセスの問題ではないことはわかっています。

この方法が機能しない理由や修正方法を誰か思いつきますか?

ありがとうございました!

[編集] リクエストに応じて、より完全なコード サンプルを次に示します。現在、自分のコンピューターにアクセスすることはできませんが、これは正確に再作成する必要があります。必要なすべてのインポートを想定します。

public class GlobalVariables{

    public boolean keepPlaying;
    public MediaPlayer mPlayer;

    // Getter and setter methods, found to be unnecessary
    public void setKeepPlaying(boolean input){keepPlaying = input;}
    public boolean getKeepPlaying(){return keepPlaying;}
}

// First activity. Music plays after starting Activity, as expected.
public class FirstActivity extends Activity{

    @Override
    public void onCreate(...){
        super.onCreate(...);

        GlobalVariables.keepPlaying = false;
        GlobalVariables.mPlayer.create(this, R.raw.music);
    }

    @Override
    public void onStop(){
        super.onStop();

        // Check to see if we want to stop audio playback
        if(GlobalVariables.keepPlaying == false){
            GlobalVariables.mPlayer.pause();
    }

    @Override
    public void onResume(){
        super.onResume();

        // If audio is already playing, set keepPlaying to false. Otherwise, start audio playback.
        if(GlobalVariables.keepPlaying == true) //Thus audio is playing
            GlobalVariables.keepPlaying = false;
        else
            GlobalVariables.mPlayer.start();
    }

    public void launchNextActivity(){
        GlobalVariables.keepPlaying = true;
        startActivity(new Intent(FirstActivity.this, SecondActivity.class));
    }

}

Code for SecondActivity is the same as FirstActivity. When starting SecondActivity, the music abruptly stops. When hiding the app and resuming it, the music begins playing again.
4

1 に答える 1

0

サービスを必要としないソリューションを思いつきました。シンプルで小さなアプリの場合、これは問題なく機能します。

MediaPlayer で音楽を再生するアクティビティの数を追跡する public int 変数を作成する必要があります。これは、GlobalVariables という名前の .java ファイルに配置することで実現しました。

public int activitiesPlaying;

この int を必ず 0 に初期化してください。私の場合、メイン メニューに戻ると音楽が停止するように、メイン メニューのアクティビティの onStart() メソッドでこの手順を実行しました。

GlobalVariables.activitiesPlaying = 0;

それ以降は、音楽を再生したいアクティビティごとに、各アクティビティの onStart() メソッドと onStop() メソッドを操作するだけです。私の場合、アクティビティの開始時に音楽が再生されるはずなので、 onStart() はかなり単純でした:

public void onStart(){
    super.onStart();

    GlobalVariables.activitiesPlaying++;
    GlobalVariables.mPlayer.start(); // MediaPlayer is stored in GlobalVariables
}

onStop() も同様ですが、ActivitiesPlaying の値を確認する必要があります。まず、アクティビティが停止しているため、activitesPlaying をデクリメントします。<= 0 の場合は、音楽の再生を一時停止し、ハウスキーピングのために、何らかの理由で負の値に設定された場合に備えて activitiesPlaying を 0 に戻します。それはおそらく必要ではありませんが、時間のステッチとそのすべて.

public void onStop(){
    super.onStop();

    GlobalVariables.activitiesPlaying--;

    if(GlobalVariables.activitiesPlaying <= 0){
        GlobalVariables.activitiesPlaying = 0;
        GlobalVariables.mPlayer.pause();
    }
}

アクティビティのライフサイクルの順序により、上記で試したようにブール値を使用することはできません。次のアクティビティが開始されると true に設定されますが、チェックの前に false に設定され、 MediaPlayer は再生を続ける必要があります。ただし、整数値を使用すると、0 より大きい限り音楽が再生され続けるため、この決定がより柔軟になります。

サービスを使用して同様の結果を達成できることを認識しており、この問題を検討しているすべての人に検討することをお勧めします. しかし、プログラミングの経験があり、カスタム サービスに慣れていないことを考えると、このソリューションは私にとって最も理にかなっています。

于 2012-12-31T17:59:29.963 に答える