-1
我正在使用广播接收器并想知道它是如何工作的。我有以下的代码来捕获一个电话的状态:Android广播接收器+静态变量
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]
时,广播初始化所有变量(incomingCall = false
),然后执行onReceive
方法(我们得到incomingCall = true
)。触发第二个操作([OFFHOOK]
),但不初始化静态字段(incomingCall
将为false
),并且接收方获取变量的旧值;尽管在这些事件之间可能需要更多时间,并且第三个操作([IDLE]
)发生同样的事情。
接收器如何初始化变量?静态变量会发生什么? 接收器是否每次都初始化变量?如何正确保存传入的呼叫变量 - 可能是共享首选项?
我认为在这两个变体之间没有什么区别。问题是,当一个传入呼叫和一个传出呼叫发生变化(空闲,摘机),但我只需要捕获传入呼叫的变化,这就是为什么我有布尔变量 - incomingCall。 – Delphian
您可以在'PhoneListener'类中使用incomingCall布尔标志,因为该类只有一个实例,所以标志在每次广播接收时都不会重置。 –