2015-01-09 46 views
2

我有一個BroadcastReceiver,我用它來知道手機是否通過WiFi連接到Internet。Android WIFI_STATE_CHANGE和STATE_CHANGE多次觸發

我使用這種方式

<receiver android:name=".InternetReceiver" > 
    <intent-filter android:priority="0"> 
     <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
     <action android:name="android.net.wifi.STATE_CHANGE"/> 
    </intent-filter> 
</receiver> 

在InternetReceiver類,我的代碼

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 
    this.intent = intent; 

    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

    if (mWifi != null && mWifi.isAvailable()) 
    { 
     if (mWifi.isConnected()) 
     { 
      Handler h = new Handler() 
      { 
       @Override 
       public void handleMessage(Message msg) 
       { 
        if (msg.what == 1) 
        { 
         getData(1); 
        } 
        else 
        { 
         Log.e("Spygen", "No Internet connection"); 
        } 
       } 
      }; 

      new InternetChecker().isNetworkAvailable(h, 3000); 
     } 
    } 
} 

到現在爲止,一切似乎完美地工作。除此之外,方法getData(1)同時被觸發3次。換句話說,BroadcastReceiver獲得wifi狀態變化3次。

我一整天都試圖解決它,我嘗試使用SharedPreferences,但它不工作,因爲每次Receiver獲取事件時,都會啓動一個新的AsyncTask,這使得更改SharedPreferences成爲不可能,直到所有後臺任務都完成完成。

我真正想要的,就是解僱getData(1)一次。無論如何,在第一次通話之後就不再接收了嗎?

任何想法將是非常讚賞

謝謝

回答

2

我覺得這是更好地確認你想火的getData什麼狀態。不只是依靠廣播。由於啓用,禁用和任何小的更改都會觸發廣播。例如,getWifiState()== WIFI_STATE_ENABLED。