2010-02-19 23 views
38

Tôi cần nhận các chương trình phát sóng cho các tác vụ mạng như kết nối mạng, ngắt kết nối, v.v. Tôi đang sử dụng bộ thu phát sóng cho mục đích này. Bất cứ ai có thể vui lòng cho tôi biết hành động nào tôi cần chụp cho các sự kiện mạng, ngay bây giờ theo tìm kiếm của tôi trên internet Tôi đang sử dụng android.net.ConnectivityManager.CONNECTIVITY_ACTION.Hành động ý định cho các sự kiện mạng trong android sdk

Đây là lớp broadcast receiver của tôi:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class NetworkStateReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if (intent.getAction().equals(
      android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { 

     // do something.. 
    } 
} 
} 

và tôi cũng đã thêm sự cho phép để truy cập trạng thái mạng:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

ở đây là làm thế nào tôi đã tuyên bố lớp này trong file manifest

<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver"> 
    <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
    </intent-filter> 
</receiver> 

Vui lòng đề xuất cho tôi hành động đúng mục đích nếu tôi sai HOẶC nếu có cách nào khác để nắm bắt các sự kiện mạng.

Trả lời

51

Dưới đây là một ví dụ làm việc:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<receiver android:name=".receiver.ConnectivityReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

. câu trả lời

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
    } 

} 
+0

Theo thử nghiệm của tôi, tôi không cần bất kỳ sự cho phép để nhận được chương trình phát sóng cho dù wlan bây giờ là lên/xuống hoặc 3g bây giờ là lên/xuống. Tôi hơi bối rối, android.net.conn.CONNECTIVITY_CHANGE là gì sau đó tốt cho? –

+0

Nếu bạn nhìn lại, bạn sẽ thấy rằng CONNECTIVITY_CHANGE không phải là sự cho phép, nó đang đăng ký một máy thu ý định (mà bạn có thể làm theo cách khác). – Hamid

+0

Câu trả lời trông giống như câu hỏi. Vậy tại sao nó KHÔNG làm việc trước câu trả lời? –

5

yanchenko là rất nhiều hữu ích, tôi đang chỉ đơn giản hóa một chút để có được tình trạng kết nối, xin vui lòng sửa đổi onReceive như sau:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context); 
     //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability. 

    } 


    private boolean haveNetworkConnection(Context context) { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile;  
    } 
} 
+0

tại Ravi K Sharma, bạn có biết android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY không? Đó là một boolean bổ sung trong phần bổ sung Intent kể từ API cấp 1 cho biết liệu có kết nối hay không. –

+1

Về bình luận của ngày hôm qua, tôi nhận thấy nó không chính xác. Có vẻ như EXTRA_NO_CONNECTIVITY, ít nhất trong một số trường hợp, chỉ được thêm vào phần bổ sung Intent nếu không có kết nối. Vì vậy, truy cập nó với getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) được cho là mang lại một boolean đúng nếu không có kết nối nào cả, và false nếu có bất kỳ kết nối nào. Bên cạnh đó, mã trong câu trả lời này là một mẫu ** chống ** vì phân tích bị giới hạn. Nó sẽ không phát hiện kết nối Bluetooth, chia sẻ kết nối USB hoặc kết nối mạng LAN. Đừng làm thế. –

+2

Ghi công cho mã này, khi Ravi quên nó: http://stackoverflow.com/a/4239410/182653 – paulw1128

Các vấn đề liên quan