3

我有一个动态注册BroadcastReceiverService. 它AudioManager.RINGER_MODE_CHANGED_ACTION变成IntentFilter. 每次我启动服务时,我都会在onReceive()方法中收到日志消息。之后就可以正常工作了。我不希望它在每次启动服务时接收一次。你能告诉我我在这里缺少什么吗?

    receiver=new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
             Log.d("zil", "degisti");

        }
    };
    IntentFilter filter=new IntentFilter(
                    AudioManager.RINGER_MODE_CHANGED_ACTION);
    registerReceiver(receiver,filter);
4

2 回答 2

5

您感兴趣的意图AudioManager.RINGER_MODE_CHANGED_ACTION是“粘性的”。这意味着系统始终保持最后发送的广播,并且只要BroadcastReceiver注册了对该 Intent 感兴趣的 a,它就会立即接收到它。这是一个非常有用的功能,但有时它不是您想要的 ;-)

我假设您只对实际的“更改”事件感兴趣。在这种情况下,您需要忽略“当前”事件并仅侦听将来发生的任何事件。幸运的是,有一个解决方案:

在“onReceive()”中执行以下操作:

if (isInitialStickyBroadcast()) {
    // Ignore this one as we aren't interested in the current state
} else {
    Log.d("zil", "degisti");
    // Do whatever you want to do with the event here
}
于 2012-07-11T15:38:09.173 回答
0
unregisterReceiver(receiver);

这可能不起作用,因为您创建了 BroadcastReciever 的匿名内部类实现。而是创建一个嵌套/私有类,该类在您希望启动服务的活动中扩展 BroacastReceiver。然后在 Activity 生命周期回调中动态注册和注销您的接收器

于 2012-07-11T15:03:45.827 回答