Estoy creando una aplicación de música que muestra una notificación mientras se reproduce el audio. Al hacer clic, esta notificación abre la actividad principal (UI) a través de una intención.

Si bien este debería ser un proceso bastante simple, por alguna razón, no importa lo que haga, la actividad principal siempre se destruye cuando se presiona la notificación. Intenté singleTop, singleTask (tanto como indicadores de intención como valores de manifiesto), guardando paquetes de estado de instancia, en NewIntent, básicamente cualquier cosa cercana a una solución que pueda encontrar. Pero la actividad SIEMPRE está destruida. Solo puedo obtener la intención a través de getIntent.

Actividad principal: https://pastebin.com/32uuK33E

Servicio de audio: https://pastebin.com/ShiUfBMc

Manifiesto: https://pastebin.com/kPp7RSYK


Ya que "los enlaces a pastebin deben ir acompañados de un código"

aquí está la intención (he probado todas las combinaciones de indicadores relevantes, así que realmente dudo que ese sea el problema)

// creates an intent which opens the application when the notification is pressed
        private PendingIntent getPendingIntent(Context context) {
            Intent intent = getIntent(this);
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
            stackBuilder.addNextIntent(intent);
            return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        }

        // returns an intent which resumes the Main Activity and passes various song information
        private Intent getIntent(Context context) {
            int duration = player != null ? player.getDuration() : 0;
            boolean playing = player != null && player.isPlaying();

            Intent intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_SONG_INFO, getSongInfo());
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_POS, currentQueuePos);
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_DURATION, duration);
            intent.putExtra(MediaPlayerContract.INTENT_EXTRA_IS_PLAYING, playing);
            return intent;
        }

y aquí es donde estoy tratando de leer los datos

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.e(LOG_TAG, "flag got intent");
    String[] info = intent.getStringArrayExtra(MediaPlayerContract.INTENT_EXTRA_SONG_INFO);
    int pos = intent.getIntExtra(MediaPlayerContract.INTENT_EXTRA_POS, 0);
    int duration = intent.getIntExtra(MediaPlayerContract.INTENT_EXTRA_DURATION, 0);
    unpackageSongInfo(info);
    currentQueuePos = pos;
    seekBar.setMax(duration);
    setIntent(intent);
}
1
JonDal 10 sep. 2018 a las 02:58

3 respuestas

La mejor respuesta

He resuelto el problema. Necesitaba llamar al método setSessionActivity () en mi sesión de medios, así:

Intent intent = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, MediaPlayerContract.REQUEST_CODE,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
mediaSessionCompat.setSessionActivity(pendingIntent);

Editar:

También puede crear una intención simplemente llamando

setContentIntent(controller.getSessionActivity())

Después de llamar a setSessionActivity, donde el controlador es su MediaSessionController.

0
JonDal 11 sep. 2018 a las 02:35

Puede usar modos de lanzamiento para una actividad.

<activity android:name=".MainActivity"
          android:launchMode="singleTop"

SingleTop: si ya existe una instancia de la actividad en la parte superior de la tarea de destino, el sistema dirige la intención a esa instancia a través de una llamada a su método onNewIntent (), en lugar de crear una nueva instancia de la actividad.

0
nikhil_salunke 10 sep. 2018 a las 05:29

Intenta eliminar la bandera: Intent.FLAG_ACTIVITY_CLEAR_TOP y agregue el siguiente: Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

0
LifeStyle 10 sep. 2018 a las 01:22