Как использовать Действия из Уведомления без запуска Действия
Поэтому я работаю над простым музыкальным проигрывателем. Музыкальный проигрыватель, как он называется, может воспроизводить песню, приостанавливать воспроизведение, переходить к следующей песне, возвращаться к предыдущей песне и полностью останавливать воспроизведение. При воспроизведении песни будет отображаться уведомление с именем исполнителя и именем песни; Это уведомление также имеет три кнопки (Действия): Стоп, Пауза и Далее.
У меня возникли проблемы с тем, чтобы убедиться, что при нажатии любого из действий срабатывает элемент управления воспроизведением, связанный с этим действием, и я совершенно не знаю, как это сделать. Я искал Уведомление 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
экземпляр где-нибудь, чтобы вы могли отменить его регистрацию, когда действие или служба закрыта.