2012-08-24 13 views
6

Ho sviluppato un'applicazione per scaricare un file video e memorizzarlo nella scheda SD. Durante il processo, aggiorno anche l'avanzamento e lo stato del download come notifica della barra di stato utilizzando lo NotificationManager.Android getIntent() restituisce il primo tentativo

La mia classe denominata DownloadTask.java estende AsyncTask. Quindi qui aggiorno i progressi usando il metodo onProgressUpdate() dove in I uso lo NotificationManager per lo scopo. Tutto funziona come un fascino, tranne che, al termine del download, voglio fare clic sulla notifica per aprire il file video specifico. Quindi questo è quello che ho fatto:

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); 

Si noti che il fileName e NOTIFICATION_ID sono unici nel mio caso.

Il ActivityOpenDownloadedVideo.java apre il file:

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) { 
     // 
    } 
} 

Così, quando a scaricare un video per la prima volta e fare clic sulla notifica sarà aperto il file video appropriato. Tuttavia la prossima volta quando scaricherò un altro video, e clicco sulla notifica, il primo file che è stato scaricato verrà riaperto.

Questo perché getIntent all'interno di OpenDownloadedVideo restituisce il primo Intent creato e non l'ultimo. Come posso correggere questo?

Inoltre, si noti che lo scenario del problema si verifica quando si scarica più di un video, ad es. se scarico cinque diversi file video e ci sono cinque notifiche nella barra di stato. Lo stesso file verrà aperto ogni volta che si fa clic su una notifica.

risposta

4

@Alex e @Codinguser, grazie per le risposte. Molto apprezzato. Tuttavia ho trovato una risposta diversa che ha funzionato per me. Quando si crea un PendingIntent per il Intent, passare un valore univoco ad esso. Nel mio caso stavo facendo questo:

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

ma ora sto usando NOTIFICATION_ID dato che era unico. Ho cambiato la chiamata sopra a:

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

Questo è tutto e funziona.

ho trovato alcune informazioni su di esso nella domanda Mulitple Instances of Pending Intent

0

Cosa succede se si esegue l'attività OpenDownloadedVideo SINGLE_TOP e si sovrascrive onNewIntent?

+0

come faccio che ?? scusa Sono abbastanza nuovo per questo. – Bopanna

+0

Non so se sarà di aiuto o meno. Nell'editor manifest aggiungi SINGLE_TOP per la modalità di avvio dell'attività. Quindi sostituisci l'attività suNewIntent() e inserisci lo stesso codice lì presente su onCreate –

+0

Ho eseguito l'attività 'OpenDownloadedVideo'' SINGLE_TOP' e all'interno dell'attività ho sovrascritto 'onNewIntent' e hai suggerito .. .. Ma quando l'attività viene lanciata o rilanciata, non sembra entrare nel metodo 'onNewIntent'. – Bopanna

6

Dal Android Activity.onNewIntent() documentation

noti che getIntent() restituisce ancora l'intento originale. È possibile utilizzare setIntent (Intent) per aggiornarlo in questo nuovo intent.

Pertanto, quando si ottiene il nuovo oggetto, è necessario impostarlo esplicitamente come attività.

+0

inoltre, per recuperare il nuovo intent devi eseguire l'override su NewIntent(), chiamando getIntent() restituirà il vecchio anche se usi setIntent() – DoruChidean

+0

Questa è un'ottima risposta. Avevo bisogno di usare fondamentalmente setIntent o chiamare il metodo super per onNewIntent() per assicurarmi che getIntent restituisse l'intento più recente. – welshk91

10

effettivamente solo bisogno di creare PendingIntent con PendingIntent.FLAG_UPDATE_CURRENT, in questo modo:

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. 
} 
Problemi correlati