web-dev-qa-db-ja.com

アクティビティを開始せずに通知からアクションを使用する方法

だから私はシンプルな音楽プレーヤーに取り組んでいます。音楽プレーヤーは、その名のとおり、曲の再生、再生の一時停止、次の曲への転送、前の曲への戻り、再生の完全な停止を行うことができます。曲を再生すると、アーティスト名と曲名が表示されます。この通知には、「停止」、「次を一時停止」の3つのボタン(アクション)もあります。

私が問題を抱えているのは、いずれかのアクションがクリックされたときに、そのアクションに関連する再生コントロールがトリガーされることを確認することです。まあ、それを行う方法はまったくわかりません。 Android通知: http://developer.Android.com/guide/topics/ui/notifiers/notifications.html を検索しましたが、明確ではありません、または通知アクションに関する情報が多すぎます。

以下は、簡単なアクションの例です(通知の[次へ]ボタンのクリックに関連付ける必要があります:注:以下で説明するすべてのコードは次のパッケージの下に書かれています:com.deadpixels.light.playerそしてアクティビティが呼び出されます:PlayerActivity

public void nextSong() {
    if (position == songs.size() -1) {
        Toast.makeText(this, "No more songs on queue", Toast.LENGTH_SHORT).show();
        if(mPlayer.isPlaying()) {
            return;
        }
        else {
            buttonPlay.setImageResource(R.drawable.button_play);
        }
        return;
    }
    else {
        position++;
        playSong(songs.get(position));
    }
}

これが私がやろうとしたことです:

Intent nextIntent = new Intent(KEY_NEXT);
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0);

NextIntentのアクションは次のとおりです。

public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong";

そして、それをaddAction()を介して通知に追加します。

mBuilder.addAction(R.drawable.not_action_next, "Next", nextPendingIntent);

他に何ができるか知ってる?上記で説明したものを使用しても何も起こりません。通知が表示され、3つのアクションボタンがありますが、それらをクリックしても何も起こりません。

ある時点で、アクション名を使用してインテントフィルターを追加したのではないかと思ったのですが、それらがすべて同じ名前空間にあると思ったのですが、なぜそうする必要があるのでしょうか。

30
daniel_c05

ブロードキャストを使用してこの問題を解決しました。たとえば、次の曲に進むブロードキャストを送信するには、以下を使用できます。

Intent nextIntent = new Intent(KEY_NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0);

次に、BroadcastReceiver内にActivityを登録します。

IntentFilter filter = new IntentFilter();
filter.addAction(KEY_NEXT);
// Add other actions as needed

receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(KEY_NEXT)) {
            nextSong();
        } else if (...) {
            ...
        }
        ...
    }
}

registerReceiver(receiver, filter);

サービスを使用してバックグラウンド再生を管理している場合は、アクティビティではなくサービスにBroadcastReceiverを登録する必要があります。アクティビティまたはサービスのシャットダウン時に登録を解除できるように、receiverインスタンスをどこかに保存してください。

44
acj