0

基本的に 2 を含む Android アプリを作成していますmedia players。電話のメモリから音楽を再生するものと、インターネット (URL) からストリームを再生するものがあります。

各メディア プレーヤーは、個別の で定義されますactivityService再生に使用しています。(つまり、ユーザーが再生ボタンを押すと、サービスが開始され、メディアが再生されます)。

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>

間違ったサービスが呼び出されないようにする方法を提案してください。

この問題の前編:こちら

ありがとうございました

4

1 に答える 1

0

2 つのサービスを定義したにもかかわらず、マニフェストには 1 つのサービスしか表示されず、定義したサービスに対して実行したアクションは意味がなく (コードで定義したアクションと一致しません)、無視されます。送信するインテントは明示的です。

マニフェストに両方のサービスが定義されていますか?

于 2013-02-16T00:31:44.123 に答える