2014-04-22 12 views
6

Sto provando a passare un oggetto a un BroadcastReceiver che eseguirà qualcosa al termine del download. Come posso accedere all'oggetto Intent nel metodo onReceive di BroadcastReceiver dalla mia attività? In questo momento ho questo nella mia attività:Passare dati a BroadcastReceiver da Attività utilizzando DownloadManager

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
long id = manager.enqueue(request); 

e ho questo nel mio BroadcastReceiver che fa cose quando il download è completato:

DownloadManager mgr = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE); 

Funziona tutto bene, il mio BroadcastReceiver fa quello che voglio quando il download termina. Ma ora voglio passare un oggetto dalla mia attività al BroadcastReceiver. Di solito, vorrei solo creare un intento e aggiungere l'oggetto all'intento. Ma, non ho creato un Intent nel mio codice perché BroadcastReceiver risponde al download utilizzando Context.DOWNLOAD_SERVICE.

Nel mio BroadcastReceiver, voglio ottenere dati dall'oggetto Intent nel metodo qui OnReceive():

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    intent.getParcelableExtra("object"); 
} 

Come faccio a passare i dati in questo oggetto Intent dalla mia attività? Come posso accedervi? Ho provato ad utilizzare getIntent().putExtra("object", object) ma sembra essere un intento diverso da quello utilizzato nel metodo OnReceive del BroadcastReceiver perché ho un NullPointerException

Edit: qui è il mio codice rilevante in AndroidManifest.xml

<receiver 
    android:name="com.android.devon.appfrenzy.DownloadReceiver" 
    android:exported="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
    </intent-filter> 
</receiver> 

risposta

1

Prima di scaricare viene eseguito, salvare il valore in SharedPreference

editor.putInt(MainActivity.CERIS_LAST_DW_ID_KATALOG, m_intIdKatalog); 
editor.commit(); 

Poi nel OnReceive ottenere il valore di preferenza in comune

@Override 
public void onReceive(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 
    SharedPreferences mCeris; 
    mCeris = arg0.getSharedPreferences(MainActivity.CERIS_PREFERENCES, 
      Context.MODE_PRIVATE); 

    int m_intIdKatalog = mCeris.getInt(MainActivity.CERIS_LAST_DW_ID_KATALOG, 0); 
} 
0

durante la chiamata invio broadcast inviare dati come

Intent i = new Intent(); 
    i.putExtra("string_example", "here is a broadcasted string"); 
    i.putExtra("int_example", 100); 
    sendBroadcast(i); 

e OnReceive lato() ottiene i dati da intenti come

@Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(getString(R.string.app_name), "broadcast string: " + intent.getStringExtra("string_example")); 
     Log.d(getString(R.string.app_name), "extra!: " + intent.getIntExtra("int_example",0)); 


    } 

Modificare come ur necessità ...

+0

Will chiamando sendBroadcast (i) chiamare il BroadcastReceiver più di una volta però? Perché in questo momento, il mio BroadcastReceiver viene chiamato senza chiamare sendBroadcast() e senza creare un intent. – theDazzler

+0

stai utilizzando registerReceiver (onDownloadComplete, new IntentFilter (DownloadManager.ACTION_DOWNLOAD_COMPLETE)); per registrare il ricevitore per il download manager –

+0

No, è nel mio xml però. Sto usando il codice fornito nella mia domanda e il codice ricevente nel mio AndroidManifest.xml. Controlla la mia modifica per vedere l'xml – theDazzler

2

Ma ora voglio passare un oggetto dalla mia attività a BroadcastReceiver.

Questo non è possibile. Il BroadcastReceiver non esiste, tranne quando si riceve la trasmissione. L'intero processo è forse finito prima che il download sia completato.

Siete invitati a memorizzare qualcosa in una posizione persistente (SharedPreferences, database, file) e leggerlo dal onReceive(). Questo è l'unico modo per trasferire dati a un oggetto che non esiste in un processo che potrebbe non esistere ancora.

0

Ero alle prese con questo perché l'utilizzo dell'archiviazione locale non funziona se si sta tentando di tenere traccia di più download in coda.Per fortuna i brainiancs di Google passare il Download ID attraverso come un extra, in modo da poter utilizzare:

 long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) 

Quindi utilizzare

  public class DownloadReceiver extends BroadcastReceiver 
      { 
       @Override 
       public void onReceive(final Context context, final Intent intent) 
       { 
        long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) 

        DownloadManager manager = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE); 

        DownloadManager.Query query = new DownloadManager.Query(); 
        query.setFilterById(downloadId); 

        Cursor cursor = manager.query(query); 

        if (cursor.moveToFirst()) { 
         int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); 
         int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); 
        } 

        cursor.close(); 

       } 
      } 
Problemi correlati