我正在开发一款android广播接收器,用于判断互联网连接.

问题是我的广播接收器被呼叫了两次.我希望只有在网络可用时才能给它打电话.如果不可用,我不想被通知.

这是广播接收器

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        final ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        final android.net.NetworkInfo mobile = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if (wifi.isAvailable() || mobile.isAvailable()) {
            // Do something

            Log.d("Network Available ", "Flag No 1");
        }
    }
}

这是舱单.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastreceiverforinternetconnection"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name=".NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

推荐答案

Answer to your first question:您的广播接收器被呼叫了两次,因为

您已经添加了两个<intent-filter>

  1. Change in network connection :
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

  2. Change in WiFi state:
    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />

Just use one:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />.

它只响应一个动作,而不是两个动作.更多信息请参见here.

Answer to your second question(如果互联网连接可用,您希望接收方只呼叫一次):

您的代码是完美的;只有当互联网可用时您才会通知.

UPDATE

如果只想判断移动设备是否与互联网连接,可以使用此方法判断连接.

public boolean isOnline(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    //should check null because in airplane mode it will be null
    return (netInfo != null && netInfo.isConnected());
}

Java相关问答推荐

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

如何使用jooq generator将表名和列名映射为人类可读的?

Jooq外键关系

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

如何才能使我的程序不会要求两次输入?

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

将java.util.Date转换为OffsetDateTime

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

错误:未找到扩展元素在JBossEAP 7.2中安装FUSE时出错

如何在不作为类出现的表上执行原生查询?

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

如何处理两个几乎相同的XSD文件?

从12小时开始的日期模式

视图被推出线性布局-Android

持续时间--为什么在秒为负数的情况下还要做额外的工作?

如何在Java中的重写方法参数中强制(Enum)接口实现?

由于版本不匹配,从Java 8迁移到Java 17和Spring 6 JUnit4失败

Java泛型方法重载

放置在变量中的Java成员引用不相等