Pass data to BroadcastReceiver from Activity using

2019-01-20 10:14发布

问题:

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>

回答1:

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


回答2:

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.



回答3:

while calling send broadcast send data as

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

and in side onReceive() get data from Intent as

 @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 as ur need...



回答4:

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

                }
            }