Android广播接收器+静态变量

时间:2016-04-22 13:51:33

标签: java android static broadcastreceiver

我正在使用广播接收器并想知道它是如何工作的。我有以下代码来捕捉电话的状态:

private static String mLastState="Unknown last state";
private String phoneState="Unknown phone state";
private static boolean incomingCall=false;


@Override
public void onReceive(Context context, Intent intent) {
   phoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
    if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
        LOG.debug("Outgoing call");
    } else {
        LOG.debug("Incoming call" + " " + String.valueOf(incomingCall));
    if (!mLastState.equals(phoneState)) {
     switch (phoneState) {
        case("RINGING"):
            incomingCall=true;
            mLastState="RINGING";
            LOG.debug("RINGING");
            break;
        case("OFFHOOK"):
            if (incomingCall) {
                mLastState = "OFFHOOK";
                LOG.debug("OFFHOOK");
            }
            break;
        case("IDLE"):
            if (incomingCall) {
                 mLastState="IDLE";                   
                 incomingCall=false;
                 LOG.debug("IDLE");
            }
            break;
        }
     }
    }
}

来电记录:

main: [Incoming call false]

main: [RINGING]  
main: [Incoming call true]

main: [OFFHOOK]  
main: [Incoming call true]

main: [IDLE]  
main: [Incoming call false]

日志使我感到困惑(具体来说,是来电静态变量的状态)。当我们有[RINGING]时,Broadcast会初始化所有变量(incomingCall = false),然后执行onReceive方法(我们得到incomingCall = true)。触发第二个操作([OFFHOOK]),但不初始化静态字段(incomingCall将为false),接收者获取变量的旧值;虽然这些事件之间可能需要更多时间,但第三次操作([IDLE])会发生同样的事情。

接收器如何初始化变量?静态变量会发生什么? 接收器是否每次都初始化变量?如何正确保存传入呼叫变量 - 也许是共享首选项?

1 个答案:

答案 0 :(得分:0)

您可以使用下面给出的PhoneStateListener

public class BroadCastReceiver extends BroadcastReceiver {

TelephonyManager telManager;
Context context;
PhoneListener pl;


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

    telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

    this.context = context;

    String action = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
    Log.d("Actions--------->", action);

        pl=PhoneListener.getInstance();
        telManager.listen(pl, PhoneStateListener.LISTEN_CALL_STATE);
}
}


public class PhoneListener extends PhoneStateListener {
private static PhoneListener phoneListenerInstance;


private PhoneListener()
{

}

public static PhoneListener getInstance()
{
    if(phoneListenerInstance==null)
    {
        phoneListenerInstance=new PhoneListener();
    }
    return phoneListenerInstance;
}


@Override
public void onCallStateChanged(int state, String incomingNumber) {
    super.onCallStateChanged(state, incomingNumber);

                  switch (state) {
                      case TelephonyManager.CALL_STATE_RINGING: {
                          Log.d("State", "ringing");
                          break;
                      }
                      case TelephonyManager.CALL_STATE_OFFHOOK: {
                          Log.d("State", "offhook");
                          break;
                      }
                      case TelephonyManager.CALL_STATE_IDLE: {
                         Log.d("State", "idle");
                         break;
                      }
                      default: {
                      }
                  }
    }
 }