繁体   English   中英

Android广播接收器+静态变量

[英]Android broadcast receiver + static variable

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

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] )也会发生同样的事情。

接收者如何初始化变量? 静态变量会发生什么? 接收者是否每次都初始化变量? 如何正确保存来电变量——也许是共享首选项?

您可以使用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: {
                      }
                  }
    }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM