BroadcastReceiver每次启动服务时都会收到

con*_*rad 3 android broadcastreceiver android-service android-audiomanager

我有一个动态注册BroadcastReceiverService.它得到AudioManager.RINGER_MODE_CHANGED_ACTIONIntentFilter.每次启动服务时,我都会在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);
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 5

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

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

在'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
}
Run Code Online (Sandbox Code Playgroud)