2009-11-23 6 views
60

Tôi muốn kiểm tra thời điểm mạng điện thoại trong Android tắt. Tôi có thể nắm bắt sự kiện đó không?Trình nghe mạng Android

Tôi không nhận được API thích hợp hoặc bất kỳ ví dụ nào sẽ giải thích tương tự. Nếu bất cứ ai đã thực hiện hoặc bất kỳ liên kết ví dụ nào sẽ thực sự hữu ích.

Trả lời

144

New lớp java:

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); 
    if (activeNetInfo != null) 
    { 
     Toast.makeText(context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    if(mobNetInfo != null) 
    { 
     Toast.makeText(context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 

xml mới trong AndroidManifest.xml của bạn dưới các yếu tố "hiển nhiên":

<!-- Needed to check when the network connection changes --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

xml mới trong AndroidManifest.xml của bạn dưới phần "Ứng dụng":

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
+0

hey Cảm ơn nó đã hoạt động như mong đợi – Sam97305421562

+0

như @noillusioin nói, activeNetInfo có thể rỗng. Đây là dấu hiệu cho thấy kết nối mạng JUST DISCONNECTED nếu bạn biết (lưu trạng thái) mà bạn đã kết nối trước đó. – larham1

+0

Bạn cũng cần kiểm tra NetworkInfo.isConnected – shuriquen

7

Câu trả lời ở trên chỉ hoạt động nếu dữ liệu gói di động được bật. Nếu không, ConnectivityManager sẽ là null và bạn không còn có thể lấy NetworkInfo nữa. Cách xung quanh nó là sử dụng một PhoneStateListener hoặc TelephonyManager thay thế.

16

Tôi đã sử dụng một thiết lập nhỏ để kiểm tra băng thông để xác định cách chia tỷ lệ mọi thứ, chẳng hạn như hình ảnh.

Dưới hoạt động, trong AndroidManifest:

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

Trong hoạt động nơi kiểm tra đang được thực hiện:

boolean network; 
int bandwidth; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    network = isDataConnected(); 
    bandwidth = isHighBandwidth(); 
    registerReceiver(new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      network = isDataConnected(); 
      bandwidth = isHighBandwidth(); 
     } 
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
} 
... 
private boolean isDataConnected() { 
    try { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
    } catch (Exception e) { 
     return false; 
    } 
} 

private int isHighBandwidth() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    if (info.getType() == ConnectivityManager.TYPE_WIFI) { 
     WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     return wm.getConnectionInfo().getLinkSpeed(); 
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { 
     TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     return tm.getNetworkType(); 
    } 
    return 0; 
} 

Một cách sử dụng ví dụ sau đó sẽ là:

if (network) { 
    if (bandwidth > 16) { 
     // Code for large items 
    } else if (bandwidth <= 16 && bandwidth > 8) { 
     // Code for medium items 
    } else { 
     //Code for small items 
    } 
} else { 
    //Code for disconnected 
} 

Đó là không phải là đẹp nhất, nhưng nó cho phép đủ linh hoạt mà tôi có thể thay đổi băng thông cắt cho các hạng mục de đang chờ xử lý những gì họ đang có và yêu cầu của tôi đối với họ.

+0

Tìm thấy điều này rất hữu ích, cảm ơn :) – Skynet

9

Nếu sử dụng Android Annotations là một lựa chọn cho bạn thử điều này trong các hoạt động của bạn - đó là tất cả, phần còn lại được tạo ra:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, 
     registerAt = Receiver.RegisterAt.OnResumeOnPause) 
void onConnectivityChange() { 
    //react 
} 

Sử dụng này chỉ nếu bạn đã sử dụng AndroidAnnotations - đưa phụ thuộc này bên trong dự án của bạn chỉ dành cho đoạn mã này sẽ quá mức cần thiết.

+0

Bạn có thể vui lòng giải thích thêm về câu trả lời này không. Tôi đã cố gắng tìm một thứ nhưng tôi không thể. Không có chú thích @Receiver trong thư viện chú thích của Google. Cảm ơn! – Sniper

+0

Xin chào, tôi tham khảo thư viện bên thứ ba AndroidAnnotations. Tôi cập nhật câu trả lời của mình. –

+0

Có bạn đúng, với thư viện này nó là có thể và tôi cũng tìm thấy này https://github.com/jd-alexander/flender kiểm tra xem nó không phải là xấu, nhưng bạn có thể sử dụng nó chỉ với gradle xây dựng 1.3, với các plugin xây dựng gradle mới không hoạt động – Sniper