【问题标题】:Android broadcast receiver + static variableAndroid广播接收器+静态变量
【发布时间】:2016-04-22 13:51:33
【问题描述】:

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

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])。

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

【问题讨论】:

    标签: java android static broadcastreceiver


    【解决方案1】:

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

    【讨论】:

    • 我认为这两种变体没有区别。问题是当来电和去电时发生变化(空闲,摘机),但我只需要捕捉来电变化,这就是为什么我有布尔变量-incomingCall。
    • 您可以在PhoneListener 类中使用incomingCall 布尔标志,因为该类只有一个实例,因此不会在每次广播接收时重置标志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多