【发布时间】: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