互联网连接状态更改的Android事件
我正在制作一个应用程序,在这个应用程序中,用户会频繁地向我的服务器上传信息和文件。这是通过一个专用的上传服务在新线程中完成的 我从这条线知道 您可以相对轻松地检查是否存在internet连接。您还可以获取SocketTimeoutException来检测internet连接问题。这一切都很好,当连接因任何原因无法工作时,我可以很容易地缓存上传的内容 但我的问题是,我如何知道何时重新尝试上传?恢复连接时是否会触发事件?还是我一直在做一个新的线程,然后每30秒检查一次互联网连接或者其他什么 任何想法都将不胜感激 非常老的职位 但我想和大家分享我的接收器 无需将手放在清单或其他无聊的资源上:) 用法 您的活动: 在活动中:实例化接收方 在活动中:实现所需的方法 接受者 只需将NetworkStateReceiver.java复制并粘贴到您的项目中即可互联网连接状态更改的Android事件,android,events,connection,connectivity,Android,Events,Connection,Connectivity,我正在制作一个应用程序,在这个应用程序中,用户会频繁地向我的服务器上传信息和文件。这是通过一个专用的上传服务在新线程中完成的 我从这条线知道 您可以相对轻松地检查是否存在internet连接。您还可以获取SocketTimeoutException来检测internet连接问题。这一切都很好,当连接因任何原因无法工作时,我可以很容易地缓存上传的内容 但我的问题是,我如何知道何时重新尝试上传?恢复连接时是否会触发事件?还是我一直在做一个新的线程,然后每30秒检查一次互联网连接或者其他什么 任何想
公共类NetworkStateReceiver扩展了BroadcastReceiver{
受保护集侦听器;
保护布尔连接;
公用网络状态接收器(){
侦听器=新的HashSet();
已连接=空;
}
公共void onReceive(上下文、意图){
if(intent==null | | intent.getExtras()==null)
返回;
ConnectivityManager=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY\u服务);
NetworkInfo ni=manager.getActiveNetworkInfo();
if(ni!=null&&ni.getState()==NetworkInfo.State.CONNECTED){
连接=真;
}else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)){
连接=错误;
}
notifystatetall();
}
私有void notifyStateTall(){
for(NetworkStateReceiverListener侦听器:侦听器)
通知状态(侦听器);
}
私有void notifyState(NetworkStateReceiverListener侦听器){
if(connected==null | | listener==null)
返回;
if(connected==true)
networkAvailable();
其他的
listener.networkUnavailable();
}
public void addListener(NetworkStateReceiverListener l){
添加(l);
通知国(l);
}
public void removeListener(NetworkStateReceiveListener l){
删除(l);
}
公共接口网络状态ReceiverListener{
public void networkAvailable();
公共无效网络不可用();
}
}
享受;) 不太清楚Tommaso的广播接收器中发生了什么,但它对我不起作用,这是我的实现。它仅在连接可用/不可用之间发生更改时发出通知 我还在
onResume()
中注册它,并在onPause()
中注销它。否则同上
public class NetworkStateReceiver extends BroadcastReceiver {
private ConnectivityManager mManager;
private List<NetworkStateReceiverListener> mListeners;
private boolean mConnected;
public NetworkStateReceiver(Context context) {
mListeners = new ArrayList<NetworkStateReceiverListener>();
mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
checkStateChanged();
}
public void onReceive(Context context, Intent intent) {
if (intent == null || intent.getExtras() == null)
return;
if (checkStateChanged()) notifyStateToAll();
}
private boolean checkStateChanged() {
boolean prev = mConnected;
NetworkInfo activeNetwork = mManager.getActiveNetworkInfo();
mConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
return prev != mConnected;
}
private void notifyStateToAll() {
for (NetworkStateReceiverListener listener : mListeners) {
notifyState(listener);
}
}
private void notifyState(NetworkStateReceiverListener listener) {
if (listener != null) {
if (mConnected) listener.onNetworkAvailable();
else listener.onNetworkUnavailable();
}
}
public void addListener(NetworkStateReceiverListener l) {
mListeners.add(l);
notifyState(l);
}
public void removeListener(NetworkStateReceiverListener l) {
mListeners.remove(l);
}
public interface NetworkStateReceiverListener {
public void onNetworkAvailable();
public void onNetworkUnavailable();
}
}
公共类NetworkStateReceiver扩展了BroadcastReceiver{
专用连接管理器mManager;
私人名单管理员;
私有布尔连接;
公用网络状态接收器(上下文){
mListeners=newarraylist();
mManager=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_服务);
checkStateChanged();
}
公共void onReceive(上下文、意图){
if(intent==null | | intent.getExtras()==null)
返回;
如果(checkStateChanged())notifyStateToAll();
}
私有布尔checkStateChanged(){
布尔值prev=mConnected;
NetworkInfo activeNetwork=mManager.getActiveNetworkInfo();
mConnected=activeNetwork!=null&&activeNetwork.isConnectedOrConnecting();
返回上一个!=mConnected;
}
私有void notifyStateTall(){
for(NetworkStateReceiverListener侦听器:MLListeners){
通知状态(侦听器);
}
}
私有void notifyState(NetworkStateReceiverListener侦听器){
if(侦听器!=null){
if(mConnected)listener.onNetworkAvailable();
else listener.onNetworkUnavailable();
}
}
public void addListener(NetworkStateReceiverListener l){
增加(l);
通知国(l);
}
public void removeListener(NetworkStateReceiveListener l){
删除(l);
}
公共接口网络状态ReceiverListener{
public void onNetworkAvailable();
public void onNetworkUnavailable();
}
}
如果您只想在连接发生变化时做一些简单的事情,有一个更简单的解决方案
在活动中,创建广播接收器:
private BroadcastReceiver networkStateReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
doSomethingOnNetworkChange(ni);
}
};
然后在onResume
和onPause
中进行注册:
@Override
public void onResume() {
super.onResume();
registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
public void onPause() {
unregisterReceiver(networkStateReceiver);
super.onPause();
}
Android Nougat&O(API 24+)-网络状态
对@darnmason answer(构造函数)进行了更改,使其能够在API24+上工作
public NetworkStateReceiver(Context context) {
mListeners = new ArrayList<>();
mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(NetworkStateReceiver.this, intentFilter);
checkStateChanged();
}
公共网络状态接收器(上下文){
mListeners=newarraylist();
mManager=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_服务);
IntentFilter IntentFilter=新的IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkStateCeiver.this,intentFilter);
checkStateChanged();
}
您好,我尝试了您的代码,但在没有互联网的情况下,我似乎无法呼叫接收器。但会调用internet networkAvailable()的函数,但不会调用无网络的函数…您不应该也调用unregisterReceiver(networkStateReceiver)代码>在活动的onDestroy()方法中?不要忘记向清单文件添加相应的权限:您永远不会注销接收者,这会保留一个硬的r
public class NetworkStateReceiver extends BroadcastReceiver {
private ConnectivityManager mManager;
private List<NetworkStateReceiverListener> mListeners;
private boolean mConnected;
public NetworkStateReceiver(Context context) {
mListeners = new ArrayList<NetworkStateReceiverListener>();
mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
checkStateChanged();
}
public void onReceive(Context context, Intent intent) {
if (intent == null || intent.getExtras() == null)
return;
if (checkStateChanged()) notifyStateToAll();
}
private boolean checkStateChanged() {
boolean prev = mConnected;
NetworkInfo activeNetwork = mManager.getActiveNetworkInfo();
mConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
return prev != mConnected;
}
private void notifyStateToAll() {
for (NetworkStateReceiverListener listener : mListeners) {
notifyState(listener);
}
}
private void notifyState(NetworkStateReceiverListener listener) {
if (listener != null) {
if (mConnected) listener.onNetworkAvailable();
else listener.onNetworkUnavailable();
}
}
public void addListener(NetworkStateReceiverListener l) {
mListeners.add(l);
notifyState(l);
}
public void removeListener(NetworkStateReceiverListener l) {
mListeners.remove(l);
}
public interface NetworkStateReceiverListener {
public void onNetworkAvailable();
public void onNetworkUnavailable();
}
}
private BroadcastReceiver networkStateReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
doSomethingOnNetworkChange(ni);
}
};
@Override
public void onResume() {
super.onResume();
registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
public void onPause() {
unregisterReceiver(networkStateReceiver);
super.onPause();
}
public NetworkStateReceiver(Context context) {
mListeners = new ArrayList<>();
mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(NetworkStateReceiver.this, intentFilter);
checkStateChanged();
}