2014-02-13 57 views
2
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; 
     } 
    } 

我把这个代码注册一个reciever检查互联网连接Availability.And我用下面的线把它放在Manifiest文件。但当尝试这个代码,我得到以下错误。我用这个代码schaeck互联网连接之前,我送一些data.I DONOT知道如何在manifest文件中注册该无法注册广播reciver onManifiest文件

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 
+1

因为NetworkConnectivityListener不是BroadcastReceiver的子节点,所以错误弹出为什么 –

+0

NetworkConnectivityListener nw = new NetworkConnectivityListener(); \t \t \t \t \t \t Log.i( “BP网络在”,nw.getState()的toString());我绑这个,但它总是给出消息,即使互联网是未知的 – user2771059

回答

1

由于NetworkConnectivityListener不是广播接收器的孩子,这就是为什么错误弹出的高达 SOLUTION: 清单文件注册听众如下,

<receiver android:name="org.apache.cordova.example.NetworkConnectivityListener$ConnectivityBroadcastReceiver" /> 

ALTERNATE:

注册接收器的NetworkConnectivityListener内本身作为你在Manifest中删除了条目。

0

从广播接收器延长NetworkConnectivityListener,你要注册普通班,而不是广播接收器类

+0

你能告诉我如何访问此reciver状态 – user2771059

+0

NetworkConnectivityListener nw = new NetworkConnectivityListener(); \t \t \t \t \t \t Log.i( “BP网络在”,nw.getState()的toString());我把这个绑在了一起,但它始终给出了即使互联网是可用的未知消息 – user2771059