Как использовать Действия из Уведомления без запуска Действия

Поэтому я работаю над простым музыкальным проигрывателем. Музыкальный проигрыватель, как он называется, может воспроизводить песню, приостанавливать воспроизведение, переходить к следующей песне, возвращаться к предыдущей песне и полностью останавливать воспроизведение. При воспроизведении песни будет отображаться уведомление с именем исполнителя и именем песни; Это уведомление также имеет три кнопки (Действия): Стоп, Пауза и Далее.

У меня возникли проблемы с тем, чтобы убедиться, что при нажатии любого из действий срабатывает элемент управления воспроизведением, связанный с этим действием, и я совершенно не знаю, как это сделать. Я искал Уведомление Android: http://developer.android.com/guide/topics/ui/notifiers/notifications.html но не уточняет и не выделяет слишком много информации о действиях по уведомлению.

Вот, например, простое действие (которое должно быть связано с нажатием кнопки "Далее" на уведомлении: Примечание. Весь код, описанный ниже, написан в следующем пакете: com.deadpixels.light.player и называется Activity: 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);

Ребята, вы знаете, что еще я мог попробовать? Использование того, что я объяснил выше, ничего не делает, уведомление появляется и имеет три кнопки действий, но нажатие на них ничего не делает для меня.

В какой-то момент я подумал, может быть, если я добавлю фильтры намерений с именами действий, но потом я подумал, что все они находятся в одном и том же пространстве имен, почему я должен?

1 ответ

Решение

Я решил эту проблему с помощью трансляций. Например, чтобы отправить трансляцию, которая переходит к следующей песне, вы можете использовать следующее:

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 экземпляр где-нибудь, чтобы вы могли отменить его регистрацию, когда действие или служба закрыта.

Другие вопросы по тегам