-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布爾標誌,因爲該類只有一個實例,所以標誌在每次廣播接收時都不會重置。 –