通过通知中的按钮播放上一首/下一首歌曲

时间:2019-02-01 19:28:32

标签: java android notifications android-broadcast

我有一个播放器,当用户选择一首歌曲时,播放器会通过3个按钮发出通知:上一个,播放,下一个。需要使用此按钮在后台模式下选择歌曲。但是,当我点击这个按钮任何反应。以下是通知的代码:

Intent intentPrev = new Intent(this, NotificationReceiver.class);
        intentPrev.setAction(ACTION_PREV);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentPrev);
        PendingIntent pendingIntentPrev = PendingIntent.getActivity(this, 0, intentPrev, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent intentPlay = new Intent(this, NotificationReceiver.class);
        intentPlay.setAction(ACTION_PLAY);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentPlay);
        PendingIntent pendingIntentPlay = PendingIntent.getActivity(this, 0, intentPlay, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent intentNext = new Intent(this, NotificationReceiver.class);
        intentNext.setAction(ACTION_NEXT);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentNext);
        PendingIntent pendingIntentNext = PendingIntent.getActivity(this, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.notification).
                setContentTitle(songs.get(songPos).getTitle()).setContentText(songs.get(songPos).getArtist()).
                addAction(R.drawable.previous, "Previous", pendingIntentPrev).addAction(R.drawable.pause, "Pause", pendingIntentPlay).
                addAction(R.drawable.next, "Next", pendingIntentNext);
        Notification notification = builder.build();
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);

这是Receiver的代码:

package asus.example.com.player;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import java.util.Objects;

public class NotificationReceiver extends BroadcastReceiver {

    private final String    ACTION_PREV = "PREVIOUS";
    private final String    ACTION_PLAY = "PLAY";
    private final String    ACTION_NEXT = "NEXT";
    private final MyService service     = new MyService();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Objects.equals(intent.getAction(), ACTION_PREV)){
            service.playPrev();
        }
        else if (Objects.equals(intent.getAction(), ACTION_NEXT)){
            service.playNext();
        }
    }
}

我也将接收者添加到清单:

<receiver
            android:name=".NotificationReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="PREVIOUS"/>
                <action android:name="PLAY"/>
                <action android:name="NEXT"/>
            </intent-filter>
        </receiver>

当我在调试器中观看时,我看到没有使用Receiver类,但我不明白为什么

1 个答案:

答案 0 :(得分:1)

现在,您正在使用以下语句立即发送广播:

LocalBroadcastManager.getInstance(this).sendBroadcast(intentNext);

您说您想稍后再开始Activity

PendingIntent pendingIntentNext = PendingIntent.getActivity(this, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);

(附带说明:仍然无法使用,因为在 intentNext 中,您指定了从BroadcastReceiver而不是Activity扩展的类)

应为getBroadcast()而不是getActivity()

Intent intentNext = new Intent(this, NotificationReceiver.class);
intentNext.setAction(ACTION_NEXT);
PendingIntent pendingIntentNext = PendingIntent.getBroadcast(this, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);

另一件事:使用的是 '0' 如在所有请求码(第二个参数)的PendingIntent S上。您必须为请求代码使用不同的值,因为共享同一请求代码的两个Intent被视为相同的Intent,因此最终您将3个通知Button地雷触发同样的动作。