Передача данных в BroadcastReceiver из действия с помощью DownloadManager
Я пытаюсь передать объект в BroadcastReceiver, который сделает что-то, когда загрузка будет завершена. Как получить доступ к объекту Intent в методе onReceive BroadcastReceiver из моей активности? Сейчас у меня есть это в моей деятельности:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long id = manager.enqueue(request);
и у меня есть это в моем BroadcastReceiver, который делает вещи, когда загрузка завершена:
DownloadManager mgr = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
все работает нормально, мой BroadcastReceiver делает то, что я хочу, когда загрузка завершается. Но теперь я хочу ... передайте объект из моей активности в BroadcastReceiver. Обычно я просто создаю намерение и добавляю объект к намерению. Но я не создал намерение в своем коде, потому что BroadcastReceiver отвечает на загрузку, используя контекст.ОБСЛУЖИВАНИЕ ЗАГРУЗКИ.
в моем BroadcastReceiver я хочу получить данные из объекта Intent в методе onReceive () здесь:
@Override
public void onReceive(Context context, Intent intent)
{
intent.getParcelableExtra("object");
}
как передать данные в этот объект намерения из моей деятельности? Как получить к нему доступ? Я попытался используя getIntent().putExtra("object", object)
но это, кажется, другое намерение, чем тот, который используется в методе onReceive BroadcastReceiver, потому что я получаю nullPointerException
Edit: вот мой соответствующий код в 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 ответов
перед выполнением загрузки сохраните значение в 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);
}
но теперь я хочу передать объект из моей деятельности в BroadcastReceiver.
это невозможно. The BroadcastReceiver
не существует, за исключением случаев приема трансляции. Возможно, весь ваш процесс исчезнет к моменту завершения загрузки.
вы можете хранить что-то в постоянном месте (SharedPreferences
, база данных, файл) и прочитайте это из onReceive()
. Это единственный способ передать данные объекту, который не существует в процессе этого еще может не быть.
при вызове send broadcast отправить данные как
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));
}
изменить как ur нужно...
я боролся с этим, потому что использование локального хранилища не работает, если вы пытаетесь отслеживать несколько очередей загрузки. К счастью, brainiancs в Google проходят 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();
}
}