在Android中使用BroadcastReceiver检查网络连接

Nan*_*l T 4 networking android connectivity broadcastreceiver

我正在使用BroadcastReceiver来检查我的应用程序运行时的网络连接.我已经使用Activity绑定了BroadcastReceiver以便在连接断开时带来一些像AlertDialog这样的控件.但现在我不想将此接收器限制为特定的活动,而是我希望将其应用于我的整个应用程序(所有活动).那么我应该采取什么方式来完成这项工作......

这是我用过的代码.请让我知道我的代码是否符合标准,如果出错了,请纠正我.

package com.xx.mobile;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


public class CheckforConnectivity extends Activity {
private static final String LOG_TAG = CheckforConnectivity.class.getSimpleName();
static final String ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private boolean mActiveNetState = false;
private boolean mMobileNetState = false;
private boolean mStatus = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    IntentFilter filter = new IntentFilter(ACTION);
    this.registerReceiver(ConnectivityCheckReceiver, filter);
}

@Override
protected void onDestroy(){
    super.onDestroy();
    unregisterReceiver(ConnectivityCheckReceiver);
}



private final BroadcastReceiver mConnectivityCheckReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
                boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
                    NetworkInfo currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
        Log.i(TAG, "Status : " + noConnectivity + ", Reason :" + reason + ", FailOver :" + isFailover + ", Current Network Info : " + currentNetworkInfo + ", OtherNetwork Info :" + otherNetworkInfo);

        mStatus = noConnectivity;
        Log.d(TAG, "Status :" + mStatus);

        if(mStatus){
        AlertDialog.Builder builder = new AlertDialog.Builder(NotifySMSReceived.this);
        builder.setMessage("Connection is not Available !");
        builder.setTitle("Info");
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();

            }

        });
        AlertDialog alert = builder.create();
        alert.show();
    }
    else {

            AlertDialog.Builder builder = new AlertDialog.Builder(NotifySMSReceived.this);
            builder.setMessage("Connection is Available !");
            builder.setTitle("Info");
            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();

                }

            });
            AlertDialog alert = builder.create();
            alert.show();
    }



    }
};
}
Run Code Online (Sandbox Code Playgroud)

任何形式的帮助都非常感谢.

谢谢

Flo*_*Flo 14

我认为你有两个选择.

第一种选择

首先,您应该注册您的接收器不是代码,而是在清单文件中.通过这种方式,它会自动注册为您的应用程序.在您的接收器中,您必须将网络的当前状态集中存储在自定义Application类或单例类中.

实现某种观察者模式,以便您的活动可以将自己注册到保存网络状态的自定义Application类.然后,Application类通知每个已注册的活动有关网络状态的更改.

您可以在onCreate()和onDestroy()中注册和注销Application类的活动类(更好的是onResume()和onPause()),这样只有在网络更改可见时才会通知它们.

第二种选择

另一个选择是坚持你当前的代码并集中保存广播接收器的引用,同样自定义的应用程序类将完成这项工作.

因此,您的活动知道在哪里可以找到用于注册和取消注册的接收器.但请注意,您必须找到一个启动接收器的地方.另外请记住,您必须处理由于内存不足而导致Android关闭应用程序并稍后重新启动的情况,您必须重新创建接收器.