2016-04-22 32 views
-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])がトリガされますが、静的フィールド(incomingCallfalse)が初期化されず、受信者は変数の古い値を取得します。これらのイベントの間に時間がかかることがありますが、同じことが3回目の操作([IDLE])で発生します。

レシーバはどのように変数を初期化しますか?静的変数はどうなりますか? レシーバは毎回変数を初期化しているかどうかを確認しますか?着信コール変数を正しく保存するにはどうすればいいですか?下記のよう

答えて

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: { 
         } 
        } 
    } 
} 
+0

は、私はこれらの二つの変種の間には差がないと思います。問題は、着信コールと発信コールが変化したとき(アイドル、オフフック)の変化が発生するが、着信コールの変化のみを捕捉する必要があるため、ブーリアン変数 - incomingCallがある理由です。 – Delphian

+0

'PhoneListener'クラスにはincomingCallブールフラグを使用できます。そのクラスのインスタンスは1つだけなので、フラグは各ブロードキャスト受信時にリセットされません。 –

関連する問題