Android活动未从本地服务广播

时间:2011-11-13 14:19:53

标签: android service broadcastreceiver

从这些例子来看,这看起来很简单。也许你可以告诉我我做错了什么。我无法接收从本地服务发送的广播的活动。

我有Activity1启动Service1:

startService(new Intent(Activity1.this, Service1.class));

Activity1然后启动Activity2:

startActivity(new Intent(Activity1.this, Activity2.class));

Service1,一个本地服务,监听下载:

protected final BroadcastReceiver service2DownloadBroadcastReceiver = new BroadcastReceiver()
{
    public void onReceive(final Context context, final Intent intent)
    {
        ...
        broadcastDownloadFinished(Uri.fromFile(downloadedFile));

Service1的广播接收器然后广播自己的消息:

protected Intent broadcastDownloadFinished(final Uri uri)
{
    final Intent intent = new Intent(ACTION_DOWNLOAD_FINISHED).setData(checkNotNull(uri));
    sendBroadcast(intent);

活动2,当时在前台,使用自己的广播接收器监听ACTION_DOWNLOAD_FINISHED意图:

private final BroadcastReceiver activity2DownloadBroadcastReceiver = new BroadcastReceiver()
{
    public void onReceive(final Context context, final Intent intent)
    {
        Log.i(Activity2.class.getSimpleName(), "Received download event: " + intent.getAction() + " " + intent.getData());

活动2当然会注册接收者:

protected void onResume()
{
    super.onResume();
    final IntentFilter downloadIntentFilter = new IntentFilter();
    downloadIntentFilter.addAction(ACTION_DOWNLOAD_FINISHED);
    registerReceiver(activity2DownloadBroadcastReceiver, downloadIntentFilter);

如果重要,ACTION_DOWNLOAD_FINISHED就像"com.example.intent.action.DOWNLOAD_FINISHED"

Service1在其接收器中接收下载管理器事件,并显然广播自己的自定义事件,但Activity2似乎从未接收过它。我做错了什么?在处理另一个意图的过程中广播意图是一个问题吗? (我不这么认为 - 这是异步的,对吗?)

更新:为了确保在接收广播的过程中发送广播没有问题,我改变了我的广播代码,以便在主线程上三秒后实际执行广播:< / p>

    Log.i(getClass().getSimpleName(), "...ready to broadcast");     
    final Intent intent = new Intent(ACTION_DOWNLOAD_FINISHED).setData(checkNotNull(uri));
    mainThreadHandler.postDelayed(new Runnable()
    {
        public void run()
        {
            Log.i(getClass().getSimpleName(), "...broadcasting");
            sendBroadcast(intent);
            Log.i(getClass().getSimpleName(), "...broadcasted");                
        }
    }, 3000);
    Log.i(getClass().getSimpleName(), "...scheduled to broadcast");

正如预期的那样,日志说:

...ready to broadcast
...scheduled to broadcast
...broadcasting
...broadcasted

但活动中没有收到任何内容。请帮忙。

2 个答案:

答案 0 :(得分:3)

尤里卡!我找到了!问题是我在广播意图中提供了一个数据URI。 Android意图匹配规则有点复杂。如果提供数据URI,那么您的intent过滤器必须指定匹配的MIME类型。

不幸的是,尽管Android文档说数据类型可以从数据URI中推断出来,但显然Android并不知道file://.../example.jpg是图像。所以这不起作用:

intentFilter.addDataType("image/*");

但是,我可以指定一个我接受的方案,而不是指定类型:

intentFilter.addDataScheme("file");

有效!这有点粗糙 - 并且有点人为地将我的广播限制为file: URI,但正如我现在所使用的那样,它有效。

请注意,显然我可以在广播时手动指定意图中的MIME类型,但现在这太麻烦了,因为我从Picasa下载图像所以我已经知道它们是图像(并且不是关心特定的MIME类型)。如果它变得太麻烦,我可以放弃整个setData()的事情并设置一个额外的 - 但当然我想以正确的方式做事。

答案 1 :(得分:0)

您是否已将接收器包含在活动的清单中?

<receiver
  android:name=".YourReceiver">
  <intent-filter>
    <action
      android:name="intent_name"></action>
  </intent-filter>
</receiver>