2016-04-22 124 views
-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])發生同樣的事情。

接收器如何初始化變量?靜態變量會發生什麼? 接收器是否每次都初始化變量?如何正確保存傳入的呼叫變量 - 可能是共享首選項?

回答

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