Передача данных в BroadcastReceiver из действия с помощью DownloadManager

Я пытаюсь передать объект в BroadcastReceiver, который сделает что-то, когда загрузка будет завершена. Как получить доступ к объекту Intent в методе onReceive BroadcastReceiver из моей активности? Сейчас у меня есть это в моей деятельности:

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

и у меня есть это в моем BroadcastReceiver, который делает вещи, когда загрузка завершена:

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

все работает нормально, мой BroadcastReceiver делает то, что я хочу, когда загрузка завершается. Но теперь я хочу ... передайте объект из моей активности в BroadcastReceiver. Обычно я просто создаю намерение и добавляю объект к намерению. Но я не создал намерение в своем коде, потому что BroadcastReceiver отвечает на загрузку, используя контекст.ОБСЛУЖИВАНИЕ ЗАГРУЗКИ.

в моем BroadcastReceiver я хочу получить данные из объекта Intent в методе onReceive () здесь:

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

как передать данные в этот объект намерения из моей деятельности? Как получить к нему доступ? Я попытался используя getIntent().putExtra("object", object) но это, кажется, другое намерение, чем тот, который используется в методе onReceive BroadcastReceiver, потому что я получаю nullPointerException

Edit: вот мой соответствующий код в 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>

4 ответов


перед выполнением загрузки сохраните значение в SharedPreference

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

затем в onReceive получите значение из общего предпочтения

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

но теперь я хочу передать объект из моей деятельности в BroadcastReceiver.

это невозможно. The BroadcastReceiver не существует, за исключением случаев приема трансляции. Возможно, весь ваш процесс исчезнет к моменту завершения загрузки.

вы можете хранить что-то в постоянном месте (SharedPreferences, база данных, файл) и прочитайте это из onReceive(). Это единственный способ передать данные объекту, который не существует в процессе этого еще может не быть.


при вызове send broadcast отправить данные как

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

и в side onReceive () получите данные от Intent как

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


    }

изменить как ur нужно...


я боролся с этим, потому что использование локального хранилища не работает, если вы пытаетесь отслеживать несколько очередей загрузки. К счастью, brainiancs в Google проходят Download ID Через в качестве дополнительного, так что вы можете использовать:

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

затем использовать

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

                }
            }