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