public class NetworkConnectivityListener {
private static final String TAG = "NetworkConnectivityListener";
private static final boolean DBG = false;
private Context mContext;
private HashMap<Handler, Integer> mHandlers = new HashMap<Handler, Integer>();
private State mState;
private boolean mListening;
private String mReason;
private boolean mIsFailover;
private NetworkInfo mNetworkInfo;
private NetworkInfo mOtherNetworkInfo;
private ConnectivityBroadcastReceiver mReceiver;
private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
mListening == false) {
Log.w(TAG, "onReceived() called with " + mState.toString() + " and " + intent);
return;
}
boolean noConnectivity =
intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if (noConnectivity) {
mState = State.NOT_CONNECTED;
} else {
mState = State.CONNECTED;
}
mNetworkInfo = (NetworkInfo)
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
mOtherNetworkInfo = (NetworkInfo)
intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
mReason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
mIsFailover =
intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
if (DBG) {
Log.d(TAG, "onReceive(): mNetworkInfo=" + mNetworkInfo + " mOtherNetworkInfo = "
+ (mOtherNetworkInfo == null ? "[none]" : mOtherNetworkInfo +
" noConn=" + noConnectivity) + " mState=" + mState.toString());
}
// Notifiy any handlers.
Iterator<Handler> it = mHandlers.keySet().iterator();
while (it.hasNext()) {
Handler target = it.next();
Message message = Message.obtain(target, mHandlers.get(target));
target.sendMessage(message);
}
}
};
public enum State {
UNKNOWN,
/** This state is returned if there is connectivity to any network **/
CONNECTED,
ONNECTED
}
public NetworkConnectivityListener() {
mState = State.UNKNOWN;
mReceiver = new ConnectivityBroadcastReceiver();
}
/**
* This method starts listening for network connectivity state changes.
* @param context
*/
public synchronized void startListening(Context context) {
if (!mListening) {
mContext = context;
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(mReceiver, filter);
mListening = true;
}
}
/**
* This method stops this class from listening for network changes.
*/
public synchronized void stopListening() {
if (mListening) {
mContext.unregisterReceiver(mReceiver);
mContext = null;
mNetworkInfo = null;
mOtherNetworkInfo = null;
mIsFailover = false;
mReason = null;
mListening = false;
}
}
public void registerHandler(Handler target, int what) {
mHandlers.put(target, what);
}
/**
* This methods unregisters the specified Handler.
* @param target
*/
public void unregisterHandler(Handler target) {
mHandlers.remove(target);
}
public State getState() {
return mState;
}
public NetworkInfo getNetworkInfo() {
return mNetworkInfo;
}
public NetworkInfo getOtherNetworkInfo() {
return mOtherNetworkInfo;
}
public boolean isFailover() {
return mIsFailover;
}
public String getReason() {
return mReason;
}
}
我用这段代码注册了一个接收器来检查互联网连接可用性。我使用下面的行将它放在 list 文件中。但是当尝试这段代码时我得到以下错误。我用这段代码来检查互联网连接在我发送一些数据之前。我不知道如何在 list 文件上注册这个
02-13 16:59:31.109: E/AndroidRuntime(28123): java.lang.RuntimeException: Unable to instantiate receiver org.apache.cordova.example.NetworkConnectivityListener: java.lang.ClassCastException: org.apache.cordova.example.NetworkConnectivityListener cannot be cast to android.content.BroadcastReceiver
最佳答案
因为 NetworkConnectivityListener 不是 BroadcastReceiver 的子级,这就是错误弹出的原因 解决方案: 在Manifest文件中注册监听器如下,
<receiver android:name="org.apache.cordova.example.NetworkConnectivityListener$ConnectivityBroadcastReceiver" />
备用:
像您一样在 NetworkConnectivityListener 本身中注册 Receiver,并删除 Manifest 中的条目。
关于android - 无法在 list 文件中注册广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21753086/