2014-04-22 16 views
6

Ich versuche, ein Objekt an einen BroadcastReceiver übergeben, der etwas tun wird, wenn ein Download abgeschlossen ist. Wie greife ich aus meiner Aktivität auf das Intent-Objekt in der onReceive-Methode des BroadcastReceivers zu? Im Moment habe ich dies in meiner Tätigkeit:Übergeben Sie Daten an BroadcastReceiver von Aktivität mit DownloadManager

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

und ich habe dies in meinem BroadcastReceiver die Sachen tut, wenn der Download abgeschlossen ist:

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

Es funktioniert alles gut, mein BroadcastReceiver tut, was ich will wenn der Download abgeschlossen ist. Aber jetzt möchte ich ein Objekt von meiner Aktivität an den BroadcastReceiver übergeben. Normalerweise würde ich nur eine Absicht erstellen und das Objekt der Absicht hinzufügen. Ich habe jedoch keine Absicht in meinem Code erstellt, da der BroadcastReceiver auf den Download mit Context.DOWNLOAD_SERVICE reagiert.

In meinem BroadcastReceiver, mag ich hier in der Methode OnReceive() Daten aus dem Intent-Objekt erhalten:

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

Wie kann ich Daten in dieses Intent Objekt aus meiner Tätigkeit übergeben? Wie kann ich darauf zugreifen? Ich habe versucht, getIntent().putExtra("object", object) verwenden, aber es scheint eine andere Absicht als die in der OnReceive Methode des BroadcastReceiver verwendet zu sein, weil ich eine Nullpointer

bearbeiten erhalten: hier ist mein entsprechenden Code 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> 

Antwort

1

vor dem Download ausgeführt wird, speichern Sie den Wert in SharedPreference

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

dann in OnReceive erhalten den Wert von Gemeinschafts-Preference

@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

während Rufdaten senden Daten aus Intent senden Sendung als

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

und in Seiten OnReceive() erhalten, wie

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


    } 

Modify als ur Notwendigkeit ...

+0

Wird sendBroadcast (i) rufen Sie die BroadcastReceiver mehr als einmal obwohl nennen? Weil mein BroadcastReceiver gerade aufgerufen wird, ohne sendBroadcast() aufzurufen und ohne eine Absicht zu erstellen. – theDazzler

+0

verwenden Sie registerReceiver (onDownloadComplete, neuer IntentFilter (DownloadManager.ACTION_DOWNLOAD_COMPLETE)); Empfänger für Download-Manager zu registrieren –

+0

Nein, es ist in meinem Xml obwohl. Ich verwende den in meiner Frage angegebenen Code sowie den Empfängercode in meiner AndroidManifest.xml. Überprüfen Sie meine Bearbeitung, um das XML zu sehen – theDazzler

2

Aber jetzt möchte ich ein Objekt aus meiner Aktivität an den BroadcastReceiver übergeben.

Das ist nicht möglich. Die BroadcastReceiver existiert nicht, außer beim Empfang der Sendung. Ihr vollständiger Prozess ist möglicherweise zu dem Zeitpunkt, zu dem der Download abgeschlossen ist, verschwunden.

Sie können gerne etwas an einem dauerhaften Speicherort (SharedPreferences, Datenbank, Datei) speichern und lesen Sie in onReceive(). Nur so können Daten an ein Objekt übergeben werden, das in einem noch nicht existierenden Prozess nicht existiert.

0

Ich hatte Probleme damit, weil die Verwendung von lokalem Speicher nicht funktioniert, wenn Sie versuchen, mehrere in der Warteschlange befindliche Downloads zu verfolgen.Glücklicherweise sind die brainiancs bei Google die Download ID durch als zusätzliche passieren, so können Sie verwenden:

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

Dann nutzen

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

       } 
      } 
Verwandte Themen