Cómo usar Acciones de Notificación sin iniciar Actividad


Así que estoy trabajando en un reproductor de música simple. El reproductor de música, como su nombre indica, puede reproducir una canción, pausar la reproducción, reenviar a la siguiente canción, volver a la canción anterior y detener la reproducción por completo. Cuando reproduzcas una canción, aparecerá una notificación con el Nombre del Artista y el Nombre de la canción; esta notificación también tiene tres botones (Acciones): Detener, Pausar y Siguiente.

Lo que estoy teniendo problemas con es asegurarse de que cuando se hace clic en cualquiera de las acciones, el control de reproducción relacionado con la Acción se desencadena, y bueno, no tengo ni idea de cómo hacerlo. He buscado en la notificación de Android: http://developer.android.com/guide/topics/ui/notifiers/notifications.html pero no aclara ni dedica demasiada información a las Acciones de Notificación.

Aquí hay una acción simple, por ejemplo (que debe asociarse con el botón" Siguiente", haga clic en la notificación: Nota: Todo el código descrito a continuación está escrito bajo el siguiente paquete: com.deadpixels.luz.player y la Actividad se llama: 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));
    }
}

Esto es lo que traté de hacer:

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

Donde la acción para el siguiente intento es:

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

Y luego agrego eso a la Notificación vía addAction ():

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

¿Saben qué más puedo probar? El uso de lo que he explicado anteriormente no hace nada en absoluto, la notificación aparece, y tiene tres botones de acción, pero al hacer clic en ellos no hace nada para mí.

At un punto que pensé tal vez si agregué los filtros de intención con los nombres de acción, pero luego pensé, bueno, todos están en el mismo espacio de nombres, ¿por qué debería?

Author: Nick, 2012-11-12

1 answers

He resuelto este problema usando transmisiones. Por ejemplo, para enviar una transmisión que avanza a la siguiente canción, puede usar lo siguiente:

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

Entonces, registra un BroadcastReceiver dentro de tu 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);

Si está utilizando un servicio para administrar la reproducción en segundo plano, entonces querrá registrar el BroadcastReceiver en el servicio en lugar de la actividad. Asegúrese de almacenar la instancia receiver en algún lugar para que pueda anular el registro cuando se cierre la actividad o el servicio.

 43
Author: acj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-13 18:36:23