Android TelephonyManager.CALL\u STATE\u在一个呼叫响起的同时两次呼叫响起

Android TelephonyManager.CALL\u STATE\u在一个呼叫响起的同时两次呼叫响起,android,broadcastreceiver,phone-state-listener,Android,Broadcastreceiver,Phone State Listener,我使用PhoneStateListener的后代类: class CallStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_RINGING: if

我使用PhoneStateListener的后代类:

 class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
      switch (state) {
          case TelephonyManager.CALL_STATE_RINGING:
              if (incomingNumber!=null)
              {
                // code for incoming call handling
              }


          break;           

      }
      super.onCallStateChanged(state, incomingNumber);
  }
这是我的收音机:

class ServiceReceiver extends BroadcastReceiver {
     CallStateListener phoneListener;
    @Override
    public void onReceive(final Context context, Intent intent) {

        if (phoneListener == null) {
            phoneListener = CallStateListener.getCallStateInstance(context);


            TelephonyManagerSingletone.getInstance().getTelephonyManager().listen(CallStateListener.getCallStateInstance(context),
                    android.telephony.PhoneStateListener.LISTEN_CALL_STATE);


        }   
}
舱单:

  <receiver android:name="com.library.ServiceReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>


但当我这样使用它时,我会在CallStateListener中收到重复的调用。我怎样才能解决这个问题

当我尝试你的代码时,它运行了10次而不是只运行一次!在这种情况下,最好将
phoneListener
声明为静态变量。这样您就可以保证
listen
方法不会被多次调用。看看这个:

public class ServiceReceiver extends BroadcastReceiver {
    static CallStateListener phoneListener;

    @Override
    public void onReceive(final Context context, Intent intent) {

        if (phoneListener == null) {
            phoneListener = new CallStateListener();
            TelephonyManager tm = (TelephonyManager)context.getSystemService("phone");
            tm.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
        }

    }

}
另外,我已经改变了您处理
TelephonyManager
的方式-我找不到您在代码中提到的
TelephonyManagerSingletone


我希望这能帮助别人

不确定这是一个bug还是一个特性,但自从API19以来,广播就出现了这种情况


对于那些将搜索解决方案的人,您可以跟踪以前的状态。只有在不同的情况下才做这些事情。

您呼叫监听两次,因为您的接收器接收到两个操作,但有两个不同的操作-拨出和拨入呼叫。这种情况并不总是发生——有时也会发生。我怎样才能让我的广播接收器同时监听来电和呼出电话呢?我删除了NEW_OUTGOING_CALL action,但问题依然存在。