2016-04-22 39 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布尔标志,因为该类只有一个实例,所以标志在每次广播接收时都不会重置。 –