广播接收器调用两次EXTRA_STATE_RINGING状态,导致不变数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了广播接收器调用两次EXTRA_STATE_RINGING状态,导致不变数据相关的知识,希望对你有一定的参考价值。

我打算在通话时保存通话详情,所以我实现了一个收听PHONE STATE的广播接收器。调用问题出现时,它进入EXTRA_STATE_RINGING两次我执行逻辑,所以我的逻辑调用了两次导致不变数据。

private static final String ACTION_IN = "android.intent.action.PHONE_STATE";

下面是BroadCastReceiver的onReceieve()的代码

public void onReceive(Context context, Intent intent) {
    ctx = context;
    if (intent.getAction().equals(ACTION_IN)) {
        Log.v("onReceive", "ACTION IN");
        if ((bundle = intent.getExtras()) != null) {
            Log.v("onReceive", "Bundle != NULL");
            state = bundle.getString(TelephonyManager.EXTRA_STATE);
            Log.v("onReceive", "state: "+state);
            if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            //businesslogic
            }
            }

            }
            }

我在清单中有以下许可

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  

我的接收器在清单中定义为此

<receiver android:name="IncomingCallInterceptor" >                    
<intent-filter android:priority="999">                                                 
             <action android:name="android.intent.action.PHONE_STATE"/> 
        </intent-filter>       
    </receiver>
答案

试试这个,它没有在EXTRA_STATE_RINGING上实现业务逻辑,它只在用户断开调用(CALL_STATE_IDLE)后设置。

public void onReceive(Context context, Intent intent) {
    ctx = context;
    if (intent.getAction().equals(ACTION_IN)) {
        Log.v("onReceive", "ACTION IN");
        if ((bundle = intent.getExtras()) != null) {
            Log.v("onReceive", "Bundle != NULL");
            state = bundle.getString(TelephonyManager.EXTRA_STATE);
            Boolean singlecallstate=false;
    switch (state) {
        case TelephonyManager.EXTRA_STATE_RINGING:
           singlecallstate=true;
           //any other code you want
        case TelephonyManager.CALL_STATE_IDLE:
       if(singlecallstate){
           //business logic
          singlecallstate=false;
          }
    }
  }
}

以上是关于广播接收器调用两次EXTRA_STATE_RINGING状态,导致不变数据的主要内容,如果未能解决你的问题,请参考以下文章

android广播接收器中未调用onReceive()进行静态广播

Kotlin - 广播接收器调用问题

为啥下载管理器完成后广播接收器不调用?

udp didReceiveData 接收两次

在广播接收器中调用活动字符串方法[重复]

如何从广播接收器类调用颤振方法?