2012-08-24 28 views
6

He desarrollado una aplicación para descargar un archivo de video y almacenarlo en la tarjeta SD. En el proceso, también actualizo el progreso y el estado de la descarga como una notificación de la barra de estado usando el NotificationManager.Android getIntent() devuelve el primer intento

Mi clase llamada DownloadTask.java extiende el AsyncTask. Así que aquí actualizo el progreso usando el método onProgressUpdate(), donde utilizo el NotificationManager para este propósito. Todo funciona a las mil maravillas excepto que, al completar la descarga, deseo hacer clic en la notificación para abrir el archivo de video específico. Así que esto es lo que he hecho:

mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); 

int icon = android.R.drawable.stat_sys_download_done; 
long when = System.currentTimeMillis(); 

mNotification = new Notification(icon, "", when); 
mContentTitle_complete = mContext.getString(R.string.download_complete); 
notificationIntent = new Intent(mContext,OpenDownloadedVideo.class); 
notificationIntent.putExtra("fileName", file); 
mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 
mNotification.setLatestEventInfo(mContext, file, mContentTitle_complete, mContentIntent); 
mNotification.flags = Notification.FLAG_AUTO_CANCEL; 
mNotificationManager.notify(NOTIFICATION_ID, mNotification); 

Tenga en cuenta que la fileName y NOTIFICATION_ID son únicos en mi caso.

El ActivityOpenDownloadedVideo.java abre el archivo por:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     fileName = getIntent().getExtras().getString("fileName"); 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     File videoFileToPlay = new File(Environment.getExternalStorageDirectory()+"/MyFolder"+"/"+fileName); 
     i.setDataAndType(Uri.fromFile(videoFileToPlay), "video/*"); 
     startActivity(i); 
     finish(); 
    } catch(Exception e) { 
     // 
    } 
} 

Así que cuando me descargo un vídeo por primera vez y hacer clic en la notificación se abrirá el archivo de vídeo adecuado. Sin embargo, la próxima vez que descargue otro video y haga clic en la notificación, se abrirá nuevamente el primer archivo que se descargó.

Esto es porque getIntent dentro de OpenDownloadedVideo devuelve el primer Intent creado y no el más reciente. ¿Cómo puedo corregir esto?

Además, tenga en cuenta que existe el problema cuando descargo más de un video, p. Ej. si descargo cinco archivos de video diferentes y hay cinco notificaciones en la barra de estado. El mismo archivo se abrirá cada vez que se haga clic en una notificación.

Respuesta

4

@Alex y @Codinguser, gracias por sus respuestas. Muy apreciado. Sin embargo, encontré una respuesta diferente que funcionó para mí. Al crear un PendingIntent para el Intent, pasele un valor único. En mi caso yo estaba haciendo esto:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 

pero ahora estoy usando NOTIFICATION_ID ya que era único. Cambié la llamada anterior a:

mContentIntent = PendingIntent.getActivity(mContext, NOTIFICATION_ID, 
              notificationIntent, 0); 

Eso es todo y funciona.

me encontré con algo de información sobre el mismo en la pregunta Mulitple Instances of Pending Intent

0

¿Qué sucede si realiza su actividad OpenDownloadedVideo SINGLE_TOP y anula onNewIntent?

+0

¿cómo puedo hacer eso ?? lo siento, soy bastante nuevo en esto. – Bopanna

+0

No sé si ayudará o no. En el editor de manifiestos, usted agrega SINGLE_TOP para su modo de inicio de actividad. Luego, anula su actividad en NewIntent() y coloca el mismo código que en onCreate –

+0

. He realizado la actividad 'OpenDownloadedVideo'' SINGLE_TOP' y dentro de la actividad he anulado el 'onNewIntent', como también sugirió. .. Pero cuando la actividad se inicia o relanza, no parece entrar en el método 'onNewIntent'. – Bopanna

6

Desde el Android Activity.onNewIntent() documentation

Tenga en cuenta que getIntent() sigue devolviendo la intención original. Puede usar setIntent (Intención) para actualizarlo a este nuevo Intento.

Así que cuando obtenga el nuevo Intento, debe establecerlo explícitamente como el objetivo de la actividad.

+0

también, para recuperar el nuevo intento que tiene que anular onNewIntent(), llamar a getIntent() devolverá el antiguo incluso si usa setIntent() – DoruChidean

+0

Esta es una gran respuesta. Necesitaba básicamente usar setIntent o llamar al método súper para onNewIntent() para asegurarme de que getIntent devolviera la última intención. – welshk91

10

realidad sólo necesitas crear PendingIntent con PendingIntent.FLAG_UPDATE_CURRENT, así:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
4
/** 
* Override super.onNewIntent() so that calls to getIntent() will return the 
* latest intent that was used to start this Activity rather than the first 
* intent. 
*/ 
@Override 
public void onNewIntent(Intent intent){ 
    super.onNewIntent(intent); // Propagate. 
    setIntent(intent); // Passing the new intent to setIntent() means this new intent will be the one returned whenever getIntent() is called. 
} 
Cuestiones relacionadas