-1
私は放送受信機に取り組んでいて、どのように動作するのか不思議です。Android放送受信機+静的変数
main: [Incoming call false]
main: [RINGING]
main: [Incoming call true]
main: [OFFHOOK]
main: [Incoming call true]
main: [IDLE]
main: [Incoming call false]
ログは私を混乱(具体的には、着信コール静的変数の状態):
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;
}
}
}
}
着信履歴:私は、電話の状態をキャッチするために、次のコードを持っています。 [RINGING]
がある場合、Broadcastはすべての変数(incomingCall = false
)を初期化し、次にonReceive
メソッドを実行します(incomingCall = true
を取得します)。 2番目の操作([OFFHOOK]
)がトリガされますが、静的フィールド(incomingCall
はfalse
)が初期化されず、受信者は変数の古い値を取得します。これらのイベントの間に時間がかかることがありますが、同じことが3回目の操作([IDLE]
)で発生します。
レシーバはどのように変数を初期化しますか?静的変数はどうなりますか? レシーバは毎回変数を初期化しているかどうかを確認しますか?着信コール変数を正しく保存するにはどうすればいいですか?下記のよう
は、私はこれらの二つの変種の間には差がないと思います。問題は、着信コールと発信コールが変化したとき(アイドル、オフフック)の変化が発生するが、着信コールの変化のみを捕捉する必要があるため、ブーリアン変数 - incomingCallがある理由です。 – Delphian
'PhoneListener'クラスにはincomingCallブールフラグを使用できます。そのクラスのインスタンスは1つだけなので、フラグは各ブロードキャスト受信時にリセットされません。 –