Android WIFI_STATE_CHANGE和STATE_CHANGE会多次触发

时间:2015-01-09 19:16:37

标签: android android-asynctask broadcastreceiver

我有一个BroadcastReceiver,我用它来知道手机是否通过WiFi连接到互联网。

我这样用它

<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获得3次wifi状态更改。

我整天都试图解决它,我尝试使用SharedPreferences,但它没有工作,因为每次Receiver获取事件时,它都会启动一个新的AsyncTask,这使得更改SharedPreferences成为不可能,直到所有后台任务已完成。

我真正想要的是,一次触发getData(1)。无论如何在第一次通话后停止接收?

任何想法都将非常感激

谢谢

1 个答案:

答案 0 :(得分:2)

我认为最好确认你想要触发getData的状态。不仅仅依靠广播。启用,禁用和任何小的更改都将触发广播。例如,getWifiState()== WIFI_STATE_ENABLED。