如何在设备丢失网络连接时收到通知?

ana*_*und 29 android

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

但在我的应用程序中,我想要做的是在设备将其状态从"网络"更改为"无网络"时收到通知.例如,当用户进入隧道并丢失信号等时会发生这种情况.或者当在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;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

另外,我在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>
Run Code Online (Sandbox Code Playgroud)

Geo*_*its 24

您可能需要考虑使用BroadcastReceiverfor ConnectivityManager.CONNECTIVITY_ACTION代替.来自文档:

发生了网络连接的变化.已建立或丢失连接.受影响网络的NetworkInfo是作为额外发送的; 应该查看是否发生了什么类型的连接事件.

此接收器适用于WiFi和蜂窝数据连接,不同于此PhoneStateListener.LISTEN_DATA_CONNECTION_STATE,它只会通知您蜂窝网络的变化.

  • 我相信正确的接收器是[`ConnectivityManager.CONNECTIVITY_ACTION`](http://developer.android.com/reference/android/net/ConnectivityManager.html). (2认同)

小智 15

myTelephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

callStateListener = new PhoneStateListener(){
    public void onDataConnectionStateChanged(int state){
        switch(state){
        case TelephonyManager.DATA_DISCONNECTED:
            Log.i("State: ", "Offline");
            // String stateString = "Offline";
            // Toast.makeText(getApplicationContext(),
            // stateString, Toast.LENGTH_LONG).show();
            break;
        case TelephonyManager.DATA_SUSPENDED:
            Log.i("State: ", "IDLE");
            // stateString = "Idle";
            // Toast.makeText(getApplicationContext(),
            // stateString, Toast.LENGTH_LONG).show();
            break;
        }
    }       
};                      
myTelephonyManager.listen(callStateListener,
            PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); 
Run Code Online (Sandbox Code Playgroud)

  • TelephonyManager如何与Wifi状态更新连接.这真的适用于wifi和其他3g互联网吗? (6认同)
  • 注意:您可以通过再次通过"LISTEN_NONE"调用listen来停止收听; 请参阅:https://groups.google.com/forum/?fromgroups =#!topic/android -beginners/PeduiZerz24 (2认同)

Mah*_*iya 9

接受的答案对我不起作用(我的平板电脑连接到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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以及对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>
Run Code Online (Sandbox Code Playgroud)