2014-04-22 7 views
6

Próbuję przekazać obiekt do BroadcastReceiver, który zrobi coś po zakończeniu pobierania. Jak uzyskać dostęp do obiektu Intent w metodzie onReceive programu BroadcastReceiver z mojej aktywności? Teraz mam to w mojej działalności:Przekazywanie danych do BroadcastReceiver z Activity za pomocą DownloadManager

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

i mam to w moim BroadcastReceiver że robi rzeczy po zakończeniu pobierania:

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

To wszystko działa dobrze, moja BroadcastReceiver robi to, co chcę po zakończeniu pobierania. Ale teraz chcę przekazać obiekt z mojej działalności do BroadcastReceiver. Zazwyczaj po prostu utworzę intencję i dodaję obiekt do intencji. Ale nie stworzyłem intencji w moim kodzie, ponieważ BroadcastReceiver odpowiada na pobieranie za pomocą Context.DOWNLOAD_SERVICE.

W moim BroadcastReceiver, chcę uzyskać dane z zamiarem obiektu w() metoda onReceive tutaj:

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

Jak mogę przekazać dane do tego obiektu Intent z mojej działalności? Jak mam do niego dostęp? Próbowałem za pomocą getIntent().putExtra("object", object) ale wydaje się być inny zamiar niż ta stosowana w onReceive metoda BroadcastReceiver ponieważ otrzymuję NullPointerException

Edycja: tutaj jest mój odpowiedni kod w 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> 

Odpowiedz

1

przed pobraniem jest wykonywany, zapisać wartość w SharedPreference

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

Następnie w onReceive uzyskać wartość od wspólną 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

podczas wywoływania wysłać broadcast wysłać dane jako

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

aw bocznej onReceive() uzyskać dane z intencyjny jako

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


    } 

Zmienić ur potrzebie ...

+0

Will nazywając sendBroadcast (I) nazywamy BroadcastReceiver więcej niż jeden raz chociaż? Ponieważ teraz mój BroadcastReceiver jest wywoływany bez wywoływania sendBroadcast() i bez tworzenia intencji. – theDazzler

+0

używasz registerReceiver (onDownloadComplete, new IntentFilter (DownloadManager.ACTION_DOWNLOAD_COMPLETE)); zarejestrować odbiornik do menedżera pobierania –

+0

Nie, ale w moim xml. Używam kodu podanego w moim pytaniu, a także kodu odbiorcy w moim AndroidManifest.xml. Sprawdź moją edycję, aby zobaczyć xml – theDazzler

2

Ale teraz chcę przekazać obiekt z mojej działalności do BroadcastReceiver.

To niemożliwe. Numer BroadcastReceiver nie istnieje, z wyjątkiem odbioru transmisji. Cały proces może minąć do czasu ukończenia pobierania.

Możesz przechowywać coś w stałej lokalizacji (SharedPreferences, baza danych, plik) i przeczytać to od onReceive(). Jest to jedyny sposób przekazywania danych do obiektu, który nie istnieje w procesie, który może jeszcze nie istnieć.

0

Walczyłem z tym, ponieważ korzystanie z magazynu lokalnego nie działa, jeśli próbujesz śledzić wiele oczekujących w kolejce pobrań.Na szczęście brainiancs w Google zdać Download ID poprzez jako dodatkowy, więc można użyć:

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

Następnie użyj

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

       } 
      } 
Powiązane problemy