Android WIFI_STATE_CHANGE 和 STATE_CHANGE 多次触发

标签 android android-asynctask 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 获取 wifi 状态变化 3 次。

我花了一整天的时间试图解决这个问题,我尝试使用 SharedPreferences,但它不起作用,因为每次接收者收到事件时,它都会启动一个新的 AsyncTask,这使得更改 SharedPreferences 变得不可能,直到所有后台任务完成.

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

任何想法将不胜感激

谢谢

最佳答案

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

关于Android WIFI_STATE_CHANGE 和 STATE_CHANGE 多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867617/

相关文章:

android - 从广播接收器调用 SetContentView()

java - Canvas OnDraw方法

android - 在 onOptionsItemSelected 之外获取菜单

android - 下载文件时更新 ListView 中的进度条

android - 在android中使用广播接收器的电话状态监听器不工作

android - Broadcastreceiver 创建多个 TelephonyManager 实例

java - 将项目添加到 ArrayList Java Android 时出错

java - android中如何实现应用程序的增量升级

java - Fragment 类中的 fatal error

java - Android - 将数据恢复到 SQLite 时的 AsyncTask 或线程