Android 使用DownloadManager将数据从活动传递到BroadcastReceiver
我正在尝试将一个对象传递给BroadcastReceiver,当下载完成时,它将执行一些操作。如何从活动访问BroadcastReceive的onReceive方法中的Intent对象?现在我的活动中有以下内容: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
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