android - wifi连接改变广播接收器重复多次

标签 android broadcastreceiver

我有以下广播接收器。

public class TestNetworkReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        String TAG = "TEST:";

        if (intent.getAction().equals("android.net.wifi.WIFI_STATE_CHANGED")) {

            Log.i(TAG, "Wifi toggled");

        } else if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {

            Log.i(TAG, "Network connection changed");

            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = cm.getActiveNetworkInfo();

            if (networkInfo != null && networkInfo.isConnected()) {

                Log.i(TAG, "Network connecion is:" + networkInfo.getTypeName());

                Log.i(TAG, "Detail:"+networkInfo.isFailover());
            }
        }
    }
}

当我打开和关闭 wifi 时

I/TEST:﹕ Wifi toggled
I/TEST:﹕ Network connection changed
I/TEST:﹕ Network connecion is:WIFI
I/TEST:﹕ Detail:false
I/TEST:﹕ Network connection changed
I/TEST:﹕ Network connecion is:WIFI
I/TEST:﹕ Detail:false
I/TEST:﹕ Network connection changed
I/TEST:﹕ Network connecion is:WIFI
I/TEST:﹕ Detail:false

I/TEST:﹕ Network connection changed
I/TEST:﹕ Network connecion is:mobile
I/TEST:﹕ Detail:true
I/TEST:﹕ Network connection changed
I/TEST:﹕ Network connecion is:mobile
I/TEST:﹕ Detail:true

我想要实现的是知道连接何时进入“移动”或“wifi”并且处于 Activity 状态但只有一次。否则它会运行我的例程 3 或 4 次。我试过更改 networkInfo.whatever() 但所有内容都会重复 3 或 4 次或更多或更少次。有没有一种方法我可以只知道连接已经改变,并且它在接收器的某个地方只有一次?

最佳答案

广播 [CONNECTIVITY_ACTION ] 似乎在少数设备上很粘,因此当您注册接收器时,它会立即调用 onReceive() 和最近发送的广播。

因此建议您需要在manifest上静态声明receiver。

这是我用过的:

@Override
protected void onResume() {
    super.onResume();
    setMyReceiverStayus(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
}

@Override
protected void onPause() {
    super.onPause();
    setMyReceiverStayus(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
}


private void setMyReceiverStayus(int receiverState) {
    ComponentName receiver = new ComponentName(this, MyReceiver.class);
    PackageManager pm = this.getPackageManager();
    pm.setComponentEnabledSetting(receiver, receiverState,       
    PackageManager.DONT_KILL_APP);
}

AndroidManifest.xml

<receiver android:name="com.example.receiver.MyReceiver">
  <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>

关于android - wifi连接改变广播接收器重复多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27119437/

相关文章:

安卓游戏开发与垃圾回收

android - 如何制作多跨文本?

android - 不 protected 广播会导致应用程序启动时崩溃

android - BroadcastReceiver CONNECTIVITY_CHANGE 总是在第一次启动应用程序时运行?

android - 如何从android中的asp页面获取VIEWSTATE和EVENTVALIDATION值

java - 可在主线程中运行的服务中运行

android - 在webview中单击按钮后,如何在android应用程序中从webview打开外部应用程序?

android - 在 Android TV 上收听 HDMI 插入和拔出事件

android - 应用程序启动前未收到 INSTALL_REFERRER

android - BroadcastReceiver 收不到广播事件消息