[英]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.