互联网连接状态更改的Android事件

互联网连接状态更改的Android事件,android,events,connection,connectivity,Android,Events,Connection,Connectivity,我正在制作一个应用程序,在这个应用程序中,用户会频繁地向我的服务器上传信息和文件。这是通过一个专用的上传服务在新线程中完成的 我从这条线知道 您可以相对轻松地检查是否存在internet连接。您还可以获取SocketTimeoutException来检测internet连接问题。这一切都很好,当连接因任何原因无法工作时,我可以很容易地缓存上传的内容 但我的问题是,我如何知道何时重新尝试上传?恢复连接时是否会触发事件?还是我一直在做一个新的线程,然后每30秒检查一次互联网连接或者其他什么 任何想

我正在制作一个应用程序,在这个应用程序中,用户会频繁地向我的服务器上传信息和文件。这是通过一个专用的上传服务在新线程中完成的

我从这条线知道

您可以相对轻松地检查是否存在internet连接。您还可以获取SocketTimeoutException来检测internet连接问题。这一切都很好,当连接因任何原因无法工作时,我可以很容易地缓存上传的内容

但我的问题是,我如何知道何时重新尝试上传?恢复连接时是否会触发事件?还是我一直在做一个新的线程,然后每30秒检查一次互联网连接或者其他什么

任何想法都将不胜感激

非常老的职位 但我想和大家分享我的接收器

无需将手放在清单或其他无聊的资源上:)

用法 您的活动: 在活动中:实例化接收方 在活动中:实现所需的方法 接受者 只需将NetworkStateReceiver.java复制并粘贴到您的项目中即可
公共类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();
}