Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass data to BroadcastReceiver from Activity using DownloadManager

I am trying to pass an object to a BroadcastReceiver which will do something when a download is finished. How do I access the Intent object in the BroadcastReceiver's onReceive method from my activity? Right now I have this in my activity:

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

and I have this in my BroadcastReceiver that does stuff when the download is complete:

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

It all works fine, my BroadcastReceiver does what I want when the download completes. But now I want to pass an object from my activity to the BroadcastReceiver. Usually, I would just create an Intent and add the object to the Intent. But, I haven't created an Intent in my code because the BroadcastReceiver responds to the download using the Context.DOWNLOAD_SERVICE.

In my BroadcastReceiver, I want to get data from the Intent object in the onReceive() method here:

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

How do I pass data into this Intent object from my activity? How do I access it? I tried using getIntent().putExtra("object", object) but it seems to be a different Intent than the one used in the BroadcastReceiver's onReceive method because I get a nullPointerException

Edit: here is my relevant 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>
like image 825
theDazzler Avatar asked Apr 22 '14 05:04

theDazzler


People also ask

How pass data from BroadcastReceiver to activity in Android?

Intent intent = getIntent(); String message = intent. getStringExtra("message"); And then you will use message as you need. If you simply want the ReceiveText activity to show the message as a dialog, declare <activity android:theme="@android:style/Theme.

When would you use a BroadcastReceiver?

Show activity on this post. A broadcast is generated by android on occurrence of some action , BroadcastReceiver class enables the developer to handle the situation on occurence of the event/action . Action can be arrival of msg or call , download complete , boot completed , etc.

How to create custom BroadcastReceiver in Android?

APPROACH : Create your own receiver class which will extend the BroadcastReceiver class of the default android. content package. You will need to override the onRecieve() method, which will take context and intent as params.


3 Answers

But now I want to pass an object from my activity to the BroadcastReceiver.

That's not possible. The BroadcastReceiver does not exist, except when receiving the broadcast. Your entire process is perhaps gone by the time the download is complete.

You are welcome to store something in a persistent location (SharedPreferences, database, file) and read that in from onReceive(). That's the only way to pass data to an object that does not exist in a process that may not yet exist.

like image 184
CommonsWare Avatar answered Oct 05 '22 11:10

CommonsWare


Before download is executed, save the value in SharedPreference

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

Then in onReceive get the value from Shared 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);   
}
like image 22
Plugie Avatar answered Oct 05 '22 12:10

Plugie


I was struggling with this because using local storage doesn't work if you're trying to keep track of multiple queued downloads. Luckily the brainiancs at Google pass the Download ID through as an extra, so you can use:

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

Then use

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

                }
            }
like image 43
Kris B Avatar answered Oct 05 '22 12:10

Kris B