Android 使用DownloadManager将数据从活动传递到BroadcastReceiver

Android 使用DownloadManager将数据从活动传递到BroadcastReceiver,android,android-intent,Android,Android Intent,我正在尝试将一个对象传递给BroadcastReceiver,当下载完成时,它将执行一些操作。如何从活动访问BroadcastReceive的onReceive方法中的Intent对象?现在我的活动中有以下内容: DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); long id = manager.enqueue(request); 我的BroadcastReceive

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

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long id = manager.enqueue(request);
我的BroadcastReceiver中有一个,下载完成后,它会做一些事情:

DownloadManager mgr = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
这一切都很好,我的广播接收器做什么,我想当下载完成。但是现在我想将一个对象从我的活动传递到广播接收器。通常,我只是创建一个意图,然后将对象添加到意图中。但是,我没有在代码中创建意图,因为BroadcastReceiver使用Context.download\u服务响应下载

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

@Override
public void onReceive(Context context, Intent intent)
{
    intent.getParcelableExtra("object");
}
如何将数据从活动传递到该意图对象?如何访问它?我尝试使用
getIntent().putExtra(“object”,object)
,但它似乎与BroadcastReceive的onReceive方法中使用的意图不同,因为我得到了一个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>

在调用“发送广播”“发送数据为”时

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


    }

根据需要修改…

在执行下载之前,请将值保存在SharedReference中

editor.putInt(MainActivity.CERIS_LAST_DW_ID_KATALOG, m_intIdKatalog);
editor.commit();
@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);   
}
然后在onReceive中从共享首选项中获取值

editor.putInt(MainActivity.CERIS_LAST_DW_ID_KATALOG, m_intIdKatalog);
editor.commit();
@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
不存在,除非在接收广播时。下载完成时,您的整个过程可能已经结束


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

我很难做到这一点,因为如果您试图跟踪多个排队下载,使用本地存储是行不通的。幸运的是,谷歌的智囊团将
下载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();

                }
            }

调用sendBroadcast(i)会多次调用BroadcastReceiver吗?因为现在,调用my BroadcastReceiver时没有调用sendBroadcast(),也没有创建意图。是否使用registerReceiver(onDownloadComplete,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));要注册下载管理器的接收器,它在我的xml中。我正在使用问题中提供的代码以及AndroidManifest.xml中的接收方代码。检查我的编辑以查看xml