基本的に 2 を含む Android アプリを作成していますmedia players
。電話のメモリから音楽を再生するものと、インターネット (URL) からストリームを再生するものがあります。
各メディア プレーヤーは、個別の で定義されますactivity
。Service
再生に使用しています。(つまり、ユーザーが再生ボタンを押すと、サービスが開始され、メディアが再生されます)。
MusicPlayer はアプリケーションのデフォルトのアクティビティであり、パッケージに含まれていますcom.example.musicplayer
。一方、ストリーム プレーヤーは別のパッケージに入っていますcom.example.streamplayer
。
問題:onStartCommand
アプリケーションを起動し、ストリーム プレーヤーを選択して再生ボタンを押すと、URL ストリームは再生されますが、他のメディア プレーヤー、つまり音楽プレーヤーも呼び出されることに気付きました。
これは、両方が異なるパッケージにある場合でも、アクティビティ B がサービス A を呼び出していることを意味します。
音楽プレーヤーのアクティビティとサービスのコード
package com.example.musicplayer;
public class MusicPlayerActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
....
Intent service = new Intent(this, MusicService.class);
startService(service);
....
}
}
package com.example.musicplayer;
public class MusicService extends Service {
....
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Toast.makeText(this, "Music Service onStartCommand()", Toast.LENGTH_LONG).show(); // This gets displayed even in the Stream Activty
return START_STICKY;
}
....
}
ストリーム アクティビティとサービスのコード:
package com.example.streamplayer;
public class StreamPlayer extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
....
Intent service = new Intent(this, StreamService.class);
service.putExtra("URL", url);
startService(service);
....
}
}
package com.example.streamplayer;
public class StreamService extends Service {
protected void startStream() {
MediaPlayer mPlayer = new MediaPlayer();
mPlayer.reset();
mPlayer.setDataSource(url);
mPlayer.prepareAsync();
mPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
}
}
マニフェスト.xml
注:マニフェストファイルでは、どのサービスがどの目的のためのものかを指定するために追加しようとしました。(これだけで動くかは不明)
<service
android:name=".MusicService"
android:enabled="true" >
<intent-filter>
<action android:name="com.example.musicplayer.MusicPlayerActivity" />
</intent-filter>
</service>
<service
android:name="com.example.streamplayer.StreamService"
android:enabled="true" >
<intent-filter>
<action android:name="com.example.streamplayer.StreamService" />
</intent-filter>
</service>
間違ったサービスが呼び出されないようにする方法を提案してください。
この問題の前編:こちら
ありがとうございました