除了使用意图过滤器之外,我可以过滤BroadcastReceiver吗?

时间:2014-09-26 09:52:18

标签: android android-intent broadcastreceiver intentfilter

根据我在文档中的理解,当我在清单中使用intent过滤器注册BroadcastReceiver时,将调用onReceive方法。 我的应用程序使用DownloadManager来处理文件下载。我想听DOWNLOAD_COMPLETE操作。所以,在我的清单中,我有一个像这样的意图过滤器:

<receiver
       android:name="com.myapp.DownloadReceiver" >
       <intent-filter>
           <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
       </intent-filter>
</receiver>

我的班级方法是这样的:

private DownloadManager manager;
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(result));
request.setTitle("MyTitle");
request.setDescription("MyDescription");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, Test.txt);
manager.enqueue(request);

此接收器将接收DownloadManager发送的所有意图。有没有办法通过监听我的应用程序排队的已完成下载来限制过滤?如果我尝试android:exported="false",它将不会收到来自其他应用程序的DownloadManager广播。 如果我过滤ID,我的onReceive方法仍然被调用。我想要实现的是避免我的接收器将收到所有事件。 谢谢!

2 个答案:

答案 0 :(得分:2)

您无法过滤DownloadManager发送给您的广播 - 只要您的接收者已注册,您将收到所有下载管理器事件的广播。

但是,您可以使用DownLoadManager.enqueue方法返回的id。在您的接收器中,您可以获得触发广播的下载ID:

Long downLoadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);

此外,我不建议在清单中注册您的接收器 - 这将在所有下载管理器事件上调用您的应用程序,您可能不希望这样。相反,在您下载后将代码注册到代码中,并在下载完成后删除它(成功与否)。还记得在活动被销毁之前取消注册接收器。

如果这是不可接受的,即您有时希望在应用未激活时接收广播,则应将您的接收器注册到清单中,并根据需要打开/关闭它。

在你的清单中最初禁用接收器:

<receiver
       android:name="com.myapp.DownloadReceiver" 
       android:enabled="false" >
       <intent-filter>
           <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
       </intent-filter>
</receiver>

然后当您需要它时 - 例如在开始下载后启用它:

PackageManager pm  = getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName("com.myapp", ".DownloadReceiver");
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

当你不再想要接收广播时 - 例如当你的下载完成后禁用接收器:

pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

这样,只有在您需要时,您的应用才会收到广播。

答案 1 :(得分:0)

根据我的理解,你需要一个BroadcastReceiver,在你的情况下它应该是 public class DownloadReceiver extends BroadcastReceiver

您需要覆盖the onReceive方法,这里是您收到和处理广播的地方。 在我接收短信的情况下,我检查了

if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))

很抱歉,如果这不符合您的需求,我还没有使用过DownloadManager。