簡體   English   中英

Android廣播接收器+靜態變量

[英]Android broadcast receiver + static variable

我正在使用廣播接收器並想知道它是如何工作的。 我有以下代碼來捕捉電話的狀態:

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] ,Broadcast 會初始化所有變量( incomingCall = false ),然后執行onReceive方法(我們得到incomingCall = true )。 所述第二操作被觸發( [OFFHOOK]但不初始化靜態字段( incomingCall將是false ),並且接收器需要的變量的舊值; 盡管這些事件之間可能需要更多時間,並且第三次操作( [IDLE] )也會發生同樣的事情。

接收者如何初始化變量? 靜態變量會發生什么? 接收者是否每次都初始化變量? 如何正確保存來電變量——也許是共享首選項?

您可以使用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: {
                      }
                  }
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM