IntentService未接收网络状态更改意图

时间:2011-04-17 02:47:47

标签: android

在我的AndroidManifest.xml中,我有以下内容......

<service
    android:name=".MyIntentService" >
    <intent-filter>
        <action android:name="android.net.wifi.STATE_CHANGE" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />"
        <action android:name="com.mycompany.myapp.TEST" />
    </intent-filter>
</service>
<receiver
    android:name=".MyNetworkMonitor" >
    <intent-filter>
        <action android:name="android.net.wifi.STATE_CHANGE" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />"
    </intent-filter>
</receiver>

理想情况下,当Wi-Fi或移动互联网服务改变状态时,我希望IntentService“唤醒”并解释系统广播的意图......但事实并非如此。

然而,BroadcastReceiver确实收到了Intents,我可以让它发送一个广播意图(com.mycompany.myapp.TEST)来唤醒我的IntentService并告诉它网络状态发生了变化。

所以问题是,为什么我的IntentService不会从系统意图广播唤醒通知网络状态变化,但它将从我的BroadcastReceiver的广播唤醒。困惑。

编辑:这是您在接近凌晨5点(oops)尝试编码时获得的结果。出于某种原因,我认为com.mycompany.myapp.TEST意图是作为广播工作。

我实际做的是Intent i = new Intent ("com.mycompany.myapp.TEST")然后使用startService(i)因为<intent-filter>条目而工作(即使没有在Intent中明确指定MyIntentService.class)。这就是令人困惑的问题。

1 个答案:

答案 0 :(得分:5)

您可以将Intent消息总线视为具有三个通道:

  • 您可以开始活动
  • 您可以启动或绑定服务
  • 您可以发送广播

这三个渠道完全相互独立。您不能让服务接收广播,就像您在此处尝试的那样,只要您可以让服务接收启动活动Intent

请从服务中删除<intent-filter>。然后,在广播到达时,在您的服务上BroadcastReceiver拨打startService()(使用new Intent(context, MyIntentService.class))。