使用DownloadManager从Activity传递数据到BroadcastReceiver

时间:2014-04-22 05:13:35

标签: android android-intent

我正在尝试将对象传递给BroadcastReceiver,它将在下载完成时执行某些操作。如何从我的活动中访问BroadcastReceiver的onReceive方法中的Intent对象?现在我在我的活动中有这个:

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

我在我的BroadcastReceiver中有这个,它在下载完成后会发生这样的事情:

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

一切正常,我的BroadcastReceiver在下载完成时做了我想要的。但现在我想将一个对象从我的活动传递给BroadcastReceiver。通常,我只是创建一个Intent并将该对象添加到Intent。但是,我没有在我的代码中创建一个Intent,因为BroadcastReceiver使用Context.DOWNLOAD_SERVICE响应下载。

在我的BroadcastReceiver中,我想在onReceive()方法中从Intent对象获取数据:

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

如何从我的活动中将数据传递到此Intent对象?我该如何访问它?我尝试使用getIntent().putExtra("object", object),但它似乎与BroadcastReceiver的onReceive方法中使用的Intent不同,因为我得到一个nullPointerException

编辑:这是我在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 个答案:

答案 0 :(得分:2)

  

但现在我想将一个对象从我的活动传递给BroadcastReceiver。

那是不可能的。除了接收广播时,BroadcastReceiver不存在。下载完成后,您的整个过程可能已经消失。

欢迎您将某些内容存储在持久位置(SharedPreferences,数据库,文件中),并从onReceive()读取该内容。这是将数据传递给可能尚不存在的进程中不存在的对象的唯一方法。

答案 1 :(得分:1)

在执行下载之前,请将值保存在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);   
}

答案 2 :(得分:0)

调用发送广播时发送数据为

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

并在onSeceive()中从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));


    }

根据需要修改......

答案 3 :(得分:0)

我正在努力解决这个问题,因为如果您尝试跟踪多个排队下载,使用本地存储无法正常工作。幸运的是,谷歌的脑力劳动者将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();

                }
            }