我在BroadcastReceiver
上有一个动态注册的Service
。它得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);
答案 0 :(得分:5)
您感兴趣的意图AudioManager.RINGER_MODE_CHANGED_ACTION
是“粘性的”。这意味着系统始终保持发送的最后一个广播,并且只要注册了对该Intent感兴趣的BroadcastReceiver
,它就会立即收到它。这是一个非常有用的功能,但有时它不是你想要的; - )
我认为你只对实际的“改变”事件感兴趣。在这种情况下,您需要忽略“当前”事件并仅监听将来发生的任何事件。幸运的是,有一个解决方案:
在'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
}
答案 1 :(得分:0)
unregisterReceiver(receiver);
这可能不会起作用,因为您创建了BroadcastReciever的Anonymous内部类实现。而是创建一个嵌套/私有类,在您希望服务启动的活动中扩展BroacastReceiver。然后在Activity生命周期回调中动态注册和取消注册接收器