Android:为什么广播接收者没有收到意图?

时间:2011-08-08 13:30:53

标签: android android-intent broadcastreceiver

我有一些活动发送到服务的意图。 所有这些都在清单中注册:

<service android:name=".location.LocationService" android:label="@string/location_service_started">
                    <intent-filter>
                        <action android:name="@string/location_service_set" />
                        <action android:name="@string/location_service_start" />
                        <action android:name="@string/location_service_stop" />             
                    </intent-filter>
</service>

但是只收到location_service_start和location_service_stop意图。可能是什么原因? 有我的接收者代码:

private BroadcastReceiver LocationServiceReceiever = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(getString(R.string.location_service_stop)))
        {
            showMessage("stop");    
        }
        if(intent.getAction().equals(getString(R.string.location_service_start)))
        {
            showMessage("start");
        }   
        if(intent.getAction().equals(getString(R.string.location_service_set)))
        {
            showAlertBox("set");    

        }
    }
}; 

所以我从未看到“设置”消息。我甚至尝试将sendBroadcast用于“开始”和“设置”消息在同一个地方,但一切都仍然相同。 “开始” - 好的,“设定” - 从未收到过。

触发意图的函数:

protected void start()
    {
        Intent intent = new Intent(getString(R.string.location_service_start));
        getApplicationContext().sendBroadcast(intent);
    }

protected void set(double lat, double lon, double rad)
    {
        Intent intent = new Intent(getString(R.string.location_service_set));
        intent.putExtra("lat", lat);
        intent.putExtra("lon", lon);
        intent.putExtra("rad", rad);
        getApplicationContext().sendBroadcast(intent);
    }

两者都是正确的发送,没有错误,操作是正确的。


  

UPD:

     

哦,我的错。我忘了为新意图添加filter.addAction ...   对不起。但答案真的很有用!谢谢!

2 个答案:

答案 0 :(得分:3)

  

所有这些都在清单中注册:

通常,您不会在<intent-filter>中使用字符串资源作为操作字符串,因为您永远不想将它们国际化。

通常,除非您将该服务公开给第三方应用,否则您根本不使用<intent-filter>服务。事实上,现在,您 将您的服务暴露给第三方应用,因此任何人都可以将这些命令发送到您的服务。

  

但只收到location_service_start和location_service_stop意图

不,这些服务都没有收到。您正在使用Java代码发送广播。服务不接收广播。

  

触发意图的函数:

除非您知道自己在做什么,否则不要使用getApplicationContext()。无论您在上呼叫getApplicationContext()还是Context,因此您只需拨打sendBroadcast()即可。

答案 1 :(得分:1)

复制&amp;来自this question的粘贴我刚回答。应该是同一个问题。

您必须将每个<action />标记放在清单中的单独<intent-filter />标记内。

这应该是一个错误,因为文档声明您可以在过滤器标记中放置多个操作:

  

应包含零个或多个动作[..]标签   在里面描述过滤器的内容。

Source