Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当设备失去网络连接时,我如何接收通知?_Android - Fatal编程技术网

Android 当设备失去网络连接时,我如何接收通知?

Android 当设备失去网络连接时,我如何接收通知?,android,Android,我知道您可以编写代码,通过这些代码可以确定设备是否连接到网络 但在我的应用程序中,如果设备的状态从“网络”更改为“无网络”,我想做的是收到通知。例如,当用户进入隧道并丢失信号等时,或者当使用WiFi时,用户超出接入点的范围,无法再访问互联网时,就会发生这种情况 Android API是否提供了一些功能,您可以在其中注册一个侦听器,以便在每次网络状态发生变化时收到通知 我找到了这段代码并尝试使用它,但它没有任何作用。当网络状态更改时,我没有收到任何通知 public class Connectiv

我知道您可以编写代码,通过这些代码可以确定设备是否连接到网络

但在我的应用程序中,如果设备的状态从“网络”更改为“无网络”,我想做的是收到通知。例如,当用户进入隧道并丢失信号等时,或者当使用WiFi时,用户超出接入点的范围,无法再访问互联网时,就会发生这种情况

Android API是否提供了一些功能,您可以在其中注册一个侦听器,以便在每次网络状态发生变化时收到通知

我找到了这段代码并尝试使用它,但它没有任何作用。当网络状态更改时,我没有收到任何通知

public class ConnectivityManager extends PhoneStateListener{

Activity activity;
public ConnectivityManager(Activity a){
    TelephonyManager telephonyManager = (TelephonyManager)a.getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.listen(this, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
    activity = a;
}

@Override
public void onDataConnectionStateChanged(int state) {
    super.onDataConnectionStateChanged(state);
    switch (state) {
    case TelephonyManager.DATA_DISCONNECTED:
        new AlertDialog.Builder(activity).
        setCancelable(false).
        setTitle("Connection Manager").
        setMessage("There is no network connection. Please connect to internet and start again.").
        setNeutralButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                System.exit(0);
            }
        }).create();
        break;

    case TelephonyManager.DATA_CONNECTED:
        break;
    }
}
}
此外,我还在AndroidManifest.xml中添加了相应的权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>


< /代码> 您可能需要考虑使用<代码>广播接收器< /代码>。从文档中:

网络连接发生了变化。连接已建立或丢失。受影响网络的NetworkInfo作为额外信息发送;应咨询it部门以了解发生了何种连接事件


此接收器同时适用于WiFi和手机数据连接,与此不同,它只会在手机网络发生变化时通知您。

不确定这是否有帮助,但…

接受的答案对我不起作用(我的平板电脑已连接到WiFi-无3G)。以下代码适用于我:

public class ConnectivityChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("*** Action: " + intent.getAction());
        if(intent.getAction().equalsIgnoreCase("android.net.conn.CONNECTIVITY_CHANGE")) {
            Toast.makeText(context, "Connection changed", Toast.LENGTH_SHORT).show();
        }
    }
}
以及对AndroidManifest.xml的更改

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<receiver android:name=".custom.ConnectivityChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
</receiver>

我通过轮询ConnectionManager实现了此功能

_connectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
一旦我们有了连接管理器,只要时不时地轮询它,看看您是否仍然连接

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final Runnable networkStatusChecker = new Runnable() {
    public void run() {
        NetworkInfo activeNetwork = _connectivityManager.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
        if(!isConnected) {
            System.out.println("disconnected from network");
            networkCheckerHandle.cancel(true);
        }
    }
};
final ScheduledFuture networkCheckerHandle = scheduler.scheduleAtFixedRate(networkStatusChecker, 10, 10, SECONDS);

如果你想在科特林做到这一点。用这个

   val isInternetWorking: Boolean by lazy {
        var success = false
        try {
            val url = URL("https://google.com")
            val connection = url.openConnection() as HttpURLConnection
            connection.connectTimeout = 10000
            connection.connect()
            success = connection.responseCode === 200
        } catch (e: IOException) {
            e.printStackTrace()
        }

        return@lazy success
    }

用一根线来做这件事。

你可以很容易地使用梅林和他的胡子。在这里,您还可以获得一种连接类型:移动或wifi

implementation 'com.novoda:merlin:1.2.0'

private MerlinsBeard merlinsBeard;

private NetworkChecker(Context context){

    Merlin merlin = new Merlin.Builder()
            .withConnectableCallbacks()
            .withDisconnectableCallbacks()
            .build(context);

    merlinsBeard = new MerlinsBeard.Builder().build(context);

    merlin.registerConnectable(() -> {
        Timber.d("Connection enabled");
    });

    merlin.registerDisconnectable(() -> {
        Timber.d("Connection disabled");
    });

    merlin.bind();
}


public boolean getConnected(){
    return merlinsBeard.isConnected();
}

我认为这个问题是类似的,只是我想知道设备何时从“互联网连接”变为“无互联网连接”。无论是WiFi还是3G网络,对我来说都无关紧要。但我会调查的。谢谢,相似但不是同一个问题。我相信正确的接受者是。嗯,是的,两者都有效。这是一个字符串常量,等于我发布的值。我就是记不起常量名了。@dwnz奇怪的是,谷歌把它离线了。视频可以播放。幻灯片是(PDF警告)。假设我们已经激活并运行WiFi。我们如何捕获“移动数据”状态变化?(启用/禁用)。按照公认答案中提到的方式,它没有得到任何结果,也没有通过
ConnectivityManager.CONNECTIVITY\u ACTION
broadcast listeners获得任何结果。@GoRoS我没有尝试过,但听起来像是一个单独的问题。我对OP的理解是,他们主要想知道什么时候从“数据”变为“无数据”,注意:你可以通过再次调用listen并传递“listen\u NONE”来停止监听;请参阅:TelephonyManager如何连接Wifi状态更新。这真的适用于wifi和其他3g互联网吗?这对我连接到wifi的平板电脑不起作用。当我切换到飞行模式时-我没有收到任何通知!为什么您认为使用ConnectivityManager.CONNECTIVITY\u操作需要API级别21或更高?根据,这是在API级别1中添加的。看起来你是对的,不确定我从哪里获得API级别21。感谢您将其指向Android(API>=24)的最新版本。请检查此项。我想检查internet是否已连接,然后共享pref用于此目的我是新的我不知道有关它的所有方法和过程
implementation 'com.novoda:merlin:1.2.0'

private MerlinsBeard merlinsBeard;

private NetworkChecker(Context context){

    Merlin merlin = new Merlin.Builder()
            .withConnectableCallbacks()
            .withDisconnectableCallbacks()
            .build(context);

    merlinsBeard = new MerlinsBeard.Builder().build(context);

    merlin.registerConnectable(() -> {
        Timber.d("Connection enabled");
    });

    merlin.registerDisconnectable(() -> {
        Timber.d("Connection disabled");
    });

    merlin.bind();
}


public boolean getConnected(){
    return merlinsBeard.isConnected();
}