1

みなさん、こんにちは。助けてくれてありがとう!コードから始めましょう。
つまり、放送受信機のクラスは次のとおりです。

public class MyService extends Service {

    // ...
    // ACTION
    public static final String action = "com.mywebsite.myapp.package.class.action";
    // ...
    public void onCreate() {
        // SET BROADCAST RECEIVER
        broadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                Log.w("broadcast receiver", "action: " + action);
                if (action.equals("**")) {
                    Log.w("broadcast receiver", "**");
                }
            }
        };
        // REGISTER BROADCAST
        final IntentFilter myFilter = new IntentFilter();
        myFilter.addAction(action);
        registerReceiver(this.broadcastReceiver, myFilter);
    }
    // ....
}

そして、私はこのように断片から放送を送ろうとします

Intent myIntent = new Intent(getActivity()
        .getApplicationContext(), MediaPlayerService.class);
getActivity().startService(myIntent);
myIntent = new Intent(getActivity().getApplicationContext(),
        MediaPlayerService.class);
myIntent.setAction(MyService.action);
myIntent.putExtra("data", "*******");
getActivity().sendBroadcast(myIntent);

ただし、ブロードキャストレシーバーが呼び出されることはありません。logcatのおかげでこれを言うことができます:行Log.w( "broadcast receive"、 "action:" + action); 呼び出されることはありません。どうすれば解決できますか?

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

編集:クラスコード:

public class MediaPlayerService extends Service {

    private MediaPlayer mediaPlayer = null;
    private AudioManager audioManager;
    private BroadcastReceiver broadcastReceiver;
    private String absoluteFilePath;
    private Boolean areThereAnyErrors = false;
    private int savedVolume;
    // ACTIONS
    public static final String prepareAndPlayNewFile = "com.disgustingapps.player.AudioManagement.MediaPlayerService.prepareAndPlayNewFile";

    @Override
    public void onCreate() {
        Log.w("MediaPlayerService", "onCreate called");
        // SET BROADCAST RECEIVER
        broadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                Log.w("broadcast receiver", "action: " + action);
                if (action.equals("prepareAndPlayNewFile")) {
                    Log.w("broadcast receiver", "prepareAndPlayNewFile");
                    prepareAndPlayNewFile(intent
                            .getStringExtra("absoluteFilePath"));
                }
            }
        };
        // REGISTER BROADCAST
        final IntentFilter myFilter = new IntentFilter();
        myFilter.addAction(prepareAndPlayNewFile);
        registerReceiver(this.broadcastReceiver, myFilter);
    }

    @Override
    public void onDestroy() {
        Log.w("MediaPlayerService", "onDestroy called");
        unregisterReceiver(broadcastReceiver);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.w("MediaPlayerService", "onStartCommand called");
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

    public void prepareAndPlayNewFile(String absoluteFilePath) {
        // ...do something...
    }
}
4

2 に答える 2

1

サービスのコードとその開始方法を見ずに、問題がどこにあるのかを判断するのは困難です。

まず、サービスのonCreateにレシーバーを登録していますが、登録解除イベントはありません。ブロードキャストレシーバーをサービスクラスのグローバルスコープに配置し、onDestroy()で登録解除する必要があります(onDestroyをオーバーライドしてメッセージをログに記録します)停止を確認するため)

次に、サービスにバインドしない限り、スタートアップのコマンドが実行されるとすぐにサービスが「停止」します。

サービスを実行し続けるには、onStartCommandをオーバーライドし、START_STICKYを返す必要があります。

于 2012-08-24T20:30:34.490 に答える
0

受信していない理由はIntent、受信者がにいるためですonCreate()。 'sを' sにcontext.startService()渡すだけです。はその時点ですでに作成されている(または作成されているはずです)ので、受信しようとしても機能しません。ActivityIntentServiceonStartCommand()ServiceonCreate()

詳細はこちら

受信しようとすると、onStartCommand()1回だけ機能します(推測)。ただし、BroadcastReceiverinonStartCommandを使用すると、を呼び出した場合にのみデータが取得されますstartService()。とにかくこれを呼び出しているので、を捨てて、 sに配信されBroadcastReceiverたデータを渡すだけの方がはるかに簡単です。IntentServiceonStartCommand()

編集

@Override
public void onCreate() {
    Log.w("MediaPlayerService", "onCreate called");
}

@Override
public void onDestroy() {
    Log.w("MediaPlayerService", "onDestroy called");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.w("MediaPlayerService", "onStartCommand called");     

    String action = intent.getAction();
    Log.w("onStartCommand()", "action: " + action);

    if (action.equals("prepareAndPlayNewFile")) {
       prepareAndPlayNewFile(intent.getStringExtra("absoluteFilePath"));
    }

    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.   
    return START_STICKY;
}

次に、これを実行します。

Intent myIntent = new Intent(getActivity().getApplicationContext(), MediaPlayerService.class);
myIntent.setAction("prepareAndPlayNewFile");
myIntent.putExtra("absoluteFilePath", "/path/");
startService(myIntent);

startService()

このメソッドを呼び出すたびに、ターゲットサービスのonStartCommand(Intent、int、int)メソッドが、ここで指定されたインテントで対応して呼び出されます。これは、インターフェースをバインドして呼び出すことなく、サービスにジョブを送信するための便利な方法を提供します。

于 2012-08-24T21:03:31.170 に答える