当前位置: 首页 > 知识库问答 >
问题:

Android应用程序中用于检查互联网连接的广播接收器

广楚
2023-03-14

我正在开发一个用于检查互联网连接的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");
        }
    }
}

这是manifest.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>

共有1个答案

殷德本
2023-03-14

回答第一个问题:广播接收机被调用两次是因为

您已经添加了两个

>

  • 网络连接更改:

    WiFi状态更改:
    <操作Android:name=“Android.net.WiFi.wifi_state_changed”/>

    只需使用一个:

    它将只响应一个而不是两个动作。有关更多信息,请参见此处。

    回答你的第二个问题(如果互联网连接可用,你希望接收者只打一次电话):

    你的代码是完美的;只有当互联网可用时才通知。

    如果只想检查mobile是否与internet连接,则可以使用此方法检查连接性。

    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());
    }
    

  •  类似资料:
    • 问题内容: 我正在开发一个用于检查互联网连接的Android广播接收器。 问题是我的广播接收器被调用了两次。我希望只有在网络可用时才能调用它。如果不可用,我不想收到通知。 这是广播接收器 这是manifest.xml 问题答案: 你的第一个问题的答案:你的广播接收器被调用两次是因为 你已经添加了两个 网络连接更改: WiFi状态更改: 只需使用一个: 它将仅响应一个动作,而不是两个。有关更多信息,

    • 如何在Android中检测WIFI连接何时已建立? Android WIFI如何检测特定WIFI连接何时可用 广播接收器不工作(检测wifi是否连接) 还有更多...但可悲的是,我没有找到正确的答案。 我想做的事情是获取用户连接到网络的确切事件,然后得到一个好的方法来检测我是否可以做一个谷歌ping,或者检查是否有连接到互联网(只有WIFI,3G连接是不允许的),因为我现在使用的代码有时会失败..

    • 我需要检查的设备是否有互联网连接,我搜索一些例子,但当我复制和粘贴的代码,我总是得到错误或不推荐的函数。我也不明白我必须把检查连接的方法放在哪里,因为我需要检查viewModel中的internet连接来发出一些请求,而我找到的所有方法都在参数中有上下文,而我无法在viewModel中获得上下文。 我尝试了这段代码,但我不明白我必须把它放在哪里,我得到 有人能给我解释一下怎么开这张支票吗?

    • 我试着从这个答案(被接受的答案)。我可以使用“PING”方法,但用户界面变黑了,因为它说它会阻止用户界面线程。它看起来不太好,令人不安,所以我尝试使用第二种方法“连接到互联网上的套接字”,但我不知道如何使用Kotlin中的类。 这是android studio将Java转换为kotlin的结果 但是我不知道如何使用它。我试过这样做: 它不起作用,导致了一个错误。它说我必须通过“消费者”。 我的问题

    • 问题内容: 当我尝试在iPhone上检查互联网连接时,出现了很多错误。谁能帮我解决这个问题? 代码: 代码错误: 如果无法读取,则错误1表示: “ Int”不可转换为“ SCNetworkReachabilityFlags” 错误2和3: 找不到接受提供的参数的’init’的重载 问题答案: 为了解决注释中提到的4G问题,我已使用@AshleyMills可达性实现作为参考并重写了Swift 3.1

    • 我有一个Android注册应用程序。当移动设备和计算机都连接到同一个wifi上时,它运行良好。但是,如果移动设备的互联网连接关闭,则会出现一条吐司消息 'java.net.连接异常:2500ms后连接到/100.118.242.179(端口80)失败:isConnted失败: ECONNREFUSED(连接被拒绝)'。 如何在移动设备上没有互联网连接的情况下运行该应用程序?