我使用此代码在API 20及以下连接丢失时收到通知。
registerReceiver(getConnectivityStateBroadcastReceiver(), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
private class ConnectivityStateBroadcastReceiver extends BaseBroadcastReceiver {
/**
* @param userLoggedIn
* @param context
* @param intent
*/
@Override
protected void onReceive(Boolean userLoggedIn, Context context, Intent intent) {
Bundle extras = intent.getExtras();
boolean notConnected = extras.getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
// DO something
}
}
但它在 API 21 中不起作用。
我该如何解决这个问题?也许它与ConntivityManager. Networks Callbak有关,但我没有找到任何如何使用它的示例。谢谢。
需要的话试试这个
在类中声明必要的变量:
private static final HashMap<Network, Boolean> mNetworkStates = new HashMap<>();
private final Object mSyncNetworkState = new Object();
private Boolean mNetworkState;
定义监控接口变化的方法。mNetworkState始终显示是否至少连接了一个网络接口。
private void registerNetworkStateInfo(@NonNull final Context context) throws Exception {
final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
if (connectivityManager != null) {
connectivityManager.registerNetworkCallback(
builder.build(),
new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
mNetworkStates.put(network, true);
synchronized (mSyncNetworkState){
mNetworkState = true;
}
Log.d("Network state", "Network state: true");
}
@Override
public void onLost(@NonNull Network network) {
mNetworkStates.put(network, false);
synchronized (mSyncNetworkState){
mNetworkState = false;
Log.d("Network state", "Network state: false");
mNetworkStates.forEach(new BiConsumer<Network, Boolean>() {
@Override
public void accept(Network nextNetwork, Boolean state) {
if (state.equals(true)) {
mNetworkState= true;
Log.d("Network state", "Network state: but true");
}
}
});
}
}
}
);
} else {
synchronized (mSyncNetworkState){
mNetworkState = false;
}
throw new Exception("Connectivity Manager is not available");
}
}
使用您的mNetworkState
synchronized (mSyncNetworkState){
if (!mNetworkState) {
throw new Exception("No network available");
}
}
我将粘贴我的完整解决方案,因为我需要查看许多地方,以使其工作:
在应用程序类中
public void onCreate(){
...
IntentFilter filter = new IntentFilter();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Timber.d("using registerNetworkCallback");
createChangeConnectivityMonitor();
filter.addAction(MY_CONNECTIVITY_CHANGE);
} else {
Timber.d("using old broadcast receiver");
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
}
registerReceiver(new SyncOnConnectivityReceiver(), filter);
}
@RequiresApi(Build.VERSION_CODES.N)
private void createChangeConnectivityMonitor() {
final Intent intent = new Intent(MY_CONNECTIVITY_CHANGE);
ConnectivityManager connectivityManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
connectivityManager.registerNetworkCallback(
new NetworkRequest.Builder().build(),
new ConnectivityManager.NetworkCallback() {
/**
* @param network
*/
@Override
public void onAvailable(Network network) {
Timber.d("On available network");
sendBroadcast(intent);
}
/**
* @param network
*/
@Override
public void onLost(Network network) {
Timber.d("On not available network");
sendBroadcast(intent);
}
});
}
}
在我的接收器中:
public class SyncOnConnectivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(@Nullable final Context context, Intent intent) {
Timber.d("triggering on connectivity change");
if (context != null && isNetworkAvailable(context)) {
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
syncBusData(context);
}
});
}
}
private boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
return false;
}
private void syncData(Context context) {
}
}
在AndroidManifiest.xml中
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<receiver android:name="com.innofied.viapool.location.SyncOnConnectivityReceiver"/>
好的,我知道该怎么做了,但是我希望你能确认这个解决方案是正确的。
我所做的只是在应用程序类的onCreate中添加对该代码的调用
/**
*
*/
@SuppressLint("NewApi")
private void registerConnectivityNetworkMonitorForAPI21AndUp() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return;
}
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.registerNetworkCallback(
builder.build(),
new ConnectivityManager.NetworkCallback() {
/**
* @param network
*/
@Override
public void onAvailable(Network network) {
sendBroadcast(
getConnectivityIntent(false)
);
}
/**
* @param network
*/
@Override
public void onLost(Network network) {
sendBroadcast(
getConnectivityIntent(true)
);
}
}
);
}
/**
* @param noConnection
* @return
*/
private Intent getConnectivityIntent(boolean noConnection) {
Intent intent = new Intent();
intent.setAction("mypackage.CONNECTIVITY_CHANGE");
intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, noConnection);
return intent;
}
在IntentFilter中,我已经监视了我的API 20及以下的连接,我添加了这个
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction("mypackage.CONNECTIVITY_CHANGE");
现在我已经工作的广播接收器也收到了API 21中网络变化的通知。
问题内容: 有什么方法可以向连接到特定Wi-Fi网络的设备发送通知? 说,我有一个名为“我的Wi-Fi”的Wi-Fi网络,该网络不安全,任何人都可以连接。公共网络。 可能有N个用户连接到“我的Wi-Fi”。这些用户可以执行任何类型的交易,例如在线支付。 现在,如果我想关闭或关闭“我的Wi-Fi”路由器或接入点,这些交易可能会失败。 因此,在关闭之前,我想向连接到“我的Wi-Fi”网络的所有用户发送
有没有办法向连接到特定Wi-Fi网络的设备发送通知? 比方说,我有一个名为“我的Wi-Fi”的Wi-Fi网络,它是不安全的,即任何人都可以连接。公共网络。 可能有N个用户连接到“我的Wi-Fi”。这些用户可以执行任何类型的交易,例如在线支付。 现在,如果我想关闭或关闭“我的Wi-Fi”路由器或接入点,这些交易可能会失败。 所以在关闭之前,我想向所有连接到“我的Wi-Fi”网络的用户发送一条文本通知
我使用Iphone 11模拟器。我点击运行按钮并得到这个: 它会打开应用程序并立即关闭。我执行了,但它不起作用。这是我的扑动医生“:
问题内容: 我正在尝试制作一些docker容器来存放我的一些日常工具。但是我的许多工具都依赖于能够连接到设备(通过wifi)以提取数据。 我一直在做研究,但很困惑,想了解要支持这种情况需要做什么。我知道通常docker容器是服务器而不是客户端。但是我读过关于人们做相反的事情。 我正在尝试找出进行此操作所需的更改/配置类型。 问题答案: 默认情况下,Docker将在您的物理服务器上创建一个虚拟网络。
本文向大家介绍如何在Python3中使用telnetlib模块连接网络设备,包括了如何在Python3中使用telnetlib模块连接网络设备的使用技巧和注意事项,需要的朋友参考一下 Python中专门提供了telnetlib库,用来完成基于telnet协议的通信功能。 python3下使用telnetlib模块连接网络设备经常会遇到字节与字符不匹配的问题 问题提示如下: 以下是设备实例: 以上是
我对FireBase云消息有一个问题,我从设备中获取令牌,并通过Google FireBase通知控制台发送通知测试。但是,通知从来没有被记录,也没有被推送到android虚拟设备。FCM的文档几乎与下面的代码完全相同,其他代码很少,您还需要做什么来获得使用FireBase的推送通知。我已经完成了所有的设置信息(build.gradle添加、安装google play服务等)如文档中所指定的,但仍