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