我正在使用广播接收器并想知道它是如何工作的。我有以下代码来捕捉电话的状态:
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]
)会发生同样的事情。
接收器如何初始化变量?静态变量会发生什么? 接收器是否每次都初始化变量?如何正确保存传入呼叫变量 - 也许是共享首选项?
答案 0 :(得分:0)
您可以使用下面给出的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: {
}
}
}
}