我正在尝试将对象传递给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>
答案 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();
}
}