Android アプリケーションである mp3 プレーヤーを完成させましたが、正しいかどうかわからない問題がいくつかあります。
もっと簡単にするために、主な問題について話します。
私には2つの活動があります(プログラム(メインアクト)とエフェクト(イコライザー、バスブースター用))。
音楽を再生するためのServicePlayerという名前のサービスがあります(Mediaplayerを使用)
さて、アプリを起動します。
プログラム アクティビティが開始されます。このアクティビティでは、サービスを開始し、それをバインドして音楽を制御します。
エフェクト アクティビティを起動します (プログラム アクトのボタンを押すだけです)。このアクティビティでは、以前に作成したサービスにバインドしません。私はただ使用します:
ServicePlayer mSer = new ServicePlayer();* 注: ServicePlayer クラスにコンストラクターを定義せず、デフォルトのコンストラクターを使用するだけです (そのため、新しい servicelayer オブジェクトの作成時に初期化される変数はありません)。
それから私は使用します:
mSer.stop()// method to stop music in serviceplayer ( just call mediaplayer object to stop)
私はさまよっています:
効果アクティビティがバインドされていないときに、上記の方法が機能するのはなぜですか?.
コード行 (*) は、serviceplayer の新しいオブジェクトを作成しますか? はいの場合、音楽を再生できる serviceplayer オブジェクトが 2 つありますか? いいえの場合、最初に作成された serviceplayer のオブジェクトは 1 つだけで、次のコールバックでは、新しいサービスは作成されず、以前に作成されたサービスを使用するだけですか?
バインドせずに serviceplayer クラスのデータにアクセスするにはどうすればよいですか? 実際、私はそれを行うことができますが、初期化された serviceplayer の変数がないため、理由がわかりません (上記の行 (*) を参照してください。
どうもありがとう。
UPDATE ANSWER、助けてくれたSnicolasに感謝します:
メソッド stop() は、静的オブジェクトのメディアプレーヤーを停止するためです。(注: 静的メンバー)。静的メンバーでない場合は、NullPointerException が返されます。
はい、新しいオブジェクトを作成しますが、新しいサービスは作成しません。1 つまたは 1 つのサービス (もちろん、同じサービス) のみを起動できます。サービスが開始されると、次の startService または bindService メソッドのコールバックは新しいサービスを作成しません。古いサービスを使用するだけです。
プリミティブ変数、String、enum 型でも正常にアクセスできますが、それは以前に起動したサービスからのデータではなく、作成した新しいオブジェクトからのデータです。オブジェクト型の場合、コンストラクタで初期化しないと NullPointerException が発生します。ただし、静的メンバー データにはアクセスできます。
それが私が今理解していることなので、もちろん、それは間違っているか、十分ではない可能性があります. 寄稿できる方はお願いします。