0

ブロードキャストメカニズムを使用して、音楽再生サービスが実行されている間に通知を作成し、通知を使用してサービスと対話(再生、一時停止、停止)しようとしています。サービスの通知によるブロードキャストサービス内のBroadcastReceiverで処理されない処理

(私は通知でアクションボタンとしてPendingIntent.getService()を使用する可能性もある知っているが、これはonStartCommandを(引き金になるので、私は、このアイデアを好きではない)とI Intentオブジェクトを解析して解析してアクションを取る必要があります。これは、以下で説明するBroadcastReceiverのアプローチほどきれいではないようです)。

これまでにいくつかの(切り捨てられた)コードを使って説明してきました。

  1. 私たちは、アクションボタンを追加し、サービスのライフサイクル内で通知オブジェクトを作成であり、startForeground()を使用して通知を示します。

    ... 
    Intent i = new Intent(getBaseContext(), PlayerService.class); 
    PendingIntent piStop = PendingIntent.getBroadcast(getBaseContext(), 1, i, PendingIntent.FLAG_ONE_SHOT); 
    NotificationCompat.Action actionStopPlayback = new NotificationCompat.Action(R.drawable.ic_stop_white_36dp, "Stop playback", piStop); 
    notification.addAction(actionStopPlayback); 
    ... 
    
  2. その後、我々はサービスの内部のonCreate BroadcastReceiver()に登録されている(そしてもちろんのonDestroyでそれを登録解除し、これは、より単純化した例です)。

    IntentFilter intentFilter = new IntentFilter(); 
    registerReceiver(new BroadcastReceiver() { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
         Log.d(getClass().toString(), "Broadcast received"); 
        } 
    }, intentFilter); 
    

そして、最終的な結果は、受信機のonReceive()が呼び出されることはありませんということです。サービスは連続したもので、通知アクションがブロードキャストを送信するとアクティブになります。私はその性質上、放送をデバッグする方法がないので、私はここでブロックされています。

+0

私は、NotificationがBroadcastReceiver 'A'にブロードキャストを送信するメカニズムを使用しました。このBroadcastReceiver 'A'は、内部(内部サービス)のBroadcastReceiver 'B'にブロードキャストを送信します。 BのonReceive()では、私はそのタスクを処理します。ここでは、[サンプルgithub repo](https://github.com/rupinderjeet/NotificationActionButtonExample/tree/master/app/src/main/java/com/rupinderjeet/notificationactionbuttonexample)です。私は別の答えを求めました。 **マイクの答えを見てください**。 – rupinderjeet

答えて

3

あなたはPendingIntentのために、この明示的なIntentを作成している:これは、理由のカップルのために動作しません

Intent i = new Intent(getBaseContext(), PlayerService.class); 

。 Explicit Intent - 特定のターゲットクラス用に作成されたもの - は動的に登録されたReceiverインスタンスでは機能しません。また、これは間違ったクラスを対象にしています。ブロードキャストIntentは、Serviceクラスのターゲットは完全に失敗するだけです。 getBroadcast()PendingIntentは、BroadcastReceiverクラスをターゲットとして必要です。

動的に登録されたReceiverインスタンスの現在の設定では、暗黙的なIntentを使用する必要があります。ターゲットクラスではなくStringのアクションを持つIntentを使用します。たとえば:

Intent i = new Intent("com.hasmobi.action.STOP_PLAYBACK"); 

あなたは、あなたがReceiverを登録するために使用しているIntentFilterため、そのアクションStringを使用します。

IntentFilter intentFilter = new IntentFilter("com.hasmobi.action.STOP_PLAYBACK"); 

IntentFilterが複数のアクションを持つことができるので、あなたは、いくつかの異なるアクションを処理するための単一の受信機を登録することができますのでご注意ください。


代わりに、明示的なIntentを使用してに固執し、静的マニフェストにBroadcastReceiverクラスを登録できます。マニフェストで

public class NotificationReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ... 
    } 
} 

:たとえば

<receiver android:name=".NotificationReceiver" /> 

次に、あなたのIntent次のようになります。あなたが必要となるようしかし

Intent i = new Intent(PlayerService.this, NotificationReceiver.class); 

、これは、追加のステップが必要となります何とかブロードキャスト情報をNotificationReceiverからServiceに渡します。 LocalBroadcastManagerなど

+1

うわー私は暗黙の意図が正確に私が探していた何時間もこれを理解しようとしてきましたありがとうございました! – Gallo2fire

関連する問題