【问题标题】:Pass data to BroadcastReceiver from Activity using DownloadManager使用 DownloadManager 从 Activity 向 BroadcastReceiver 传递数据
【发布时间】:2014-04-22 05:13:34
【问题描述】:

我正在尝试将一个对象传递给一个 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 会在下载完成后执行我想要的操作。但现在我想将一个对象从我的活动传递给广播接收器。通常,我只会创建一个 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>

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

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

    editor.putInt(MainActivity.CERIS_LAST_DW_ID_KATALOG, m_intIdKatalog);
    editor.commit();
    

    然后在 onReceive 中从 Shared Preference 中获取值

    @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】:

      但现在我想将一个对象从我的活动传递给广播接收器。

      这是不可能的。 BroadcastReceiver 不存在,除非在接收广播时。下载完成时,您的整个过程可能已经结束。

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

      【讨论】:

        【解决方案3】:

        我一直在努力解决这个问题,因为如果您尝试跟踪多个排队的下载,则使用本地存储不起作用。幸运的是,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();
        
                        }
                    }
        

        【讨论】:

          【解决方案4】:

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

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

          并在 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));
          
          
              }
          

          根据需要修改...

          【讨论】:

          • 调用 sendBroadcast(i) 会多次调用 BroadcastReceiver 吗?因为现在,我的 BroadcastReceiver 在没有调用 sendBroadcast() 并且没有创建意图的情况下被调用。
          • 你在使用 registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));为下载管理器注册接收器
          • 不,它在我的 xml 中。我正在使用我的问题中提供的代码以及我的 AndroidManifest.xml 中的接收器代码。检查我的编辑以查看 xml
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多