首页 > 解决方案 > 连接改变状态广播

问题描述

在告诉我我的帖子已经得到回答之前,我使用了在这个论坛上找到的解决方案,但不知何故它对我不起作用..

我的问题:我想在网络连接打开或关闭时更改图像

所以为了做到这一点,我做了一个扩展 BroadcastReceiver 的connectivityReceiver 类,它应该通知我的主类关于网络状态的变化。

public class ConnectivityReceiver
    extends BroadcastReceiver {

public static ConnectivityReceiverListener connectivityReceiverListener;

public ConnectivityReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent arg1) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();

    if (connectivityReceiverListener != null) {
        connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
    }
}

public static boolean isConnected() {
    ConnectivityManager
            cm = (ConnectivityManager) MyApplication.getInstance().getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();
}


public interface ConnectivityReceiverListener {
    void onNetworkConnectionChanged(boolean isConnected);
}
}

当我调用网络状态的手动检查时,这确实有效,但看起来我无法在网络更改状态时通知我的 MainActivity。

MainActivity(部分代码):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    username_inputed = false;
    responseFromRequest = "";
    username_input = (EditText) findViewById(R.id.username_input);
    confirm_usrname = (ImageButton) findViewById(R.id.next_btn_username);
    passwd_input = (EditText) findViewById(R.id.password_input);
    login = (ImageButton) findViewById(R.id.next_btn_passwd);
    errorLog = (TextView) findViewById(R.id.logError);
    wifi_disp = (ImageView) findViewById(R.id.wifi_prompt);
    checkConnection();
}
private void checkConnection(){
    boolean isConnected = ConnectivityReceiver.isConnected();
    setWifiDisplay(isConnected);
}
@Override
protected void onResume(){
    super.onResume();
    //Register connection status listener
    MyApplication.getInstance().setConnectivityListener(this);
}
@Override
public void onNetworkConnectionChanged(boolean isConnected){
    setWifiDisplay(isConnected);
}
public void setWifiDisplay(boolean wifi){
    connection = wifi;
    if(wifi){
        wifi_disp.setImageResource(R.drawable.wifi_on);
    }else wifi_disp.setImageResource(R.drawable.wifi_off);
}

标签: javaandroidnetworking

解决方案


好吧,这不是一个完整的答案,但我认为您应该阅读有关sendBroadcast(Intent)向接收器发送广播的方法,并且您还应该在活动或清单文件中注册您的接收器。


推荐阅读