2011-01-08 37 views
11

Ứng dụng của tôi thực hiện một số thu thập dữ liệu backgound và tôi đang thêm hỗ trợ cho các tùy chọn mạng của người dùng, chẳng hạn như thực hiện cập nhật nền và chuyển vùng dữ liệu. Tôi có kiểm tra sau đây đã:Cách tôn trọng cài đặt sử dụng mạng trong Android

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
if(cm.getBackgroundDataSetting()) { 
... 
NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) { 

với các mục cần thiết trong biểu hiện:

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

này tất cả dường như làm việc tốt, nhưng tôi đã tự hỏi nếu tôi nên được kiểm tra bất cứ điều gì khác? Tôi lo lắng về việc kiểm tra chuyển vùng dữ liệu nhưng trạng thái docs rằng networkInfo.isAvailable() sẽ kiểm tra điều này cho tôi. Vì vậy, có bất kỳ kiểm tra khác tôi cần phải thực hiện cho các thiết lập mạng? Bất cứ điều gì khác trong lĩnh vực này tôi nên biết?

+0

Câu hỏi hay. Thông tin mạng cũng không có phương pháp isRoaming hay không. (Và bạn đang phát triển ứng dụng chỉ ở khu vực Bắc Mỹ, nếu không phải điều này có thể là một vấn đề, vì giao thức mạng có thể khác nhau). –

+0

Có, có phương thức 'isRoaming()'. Tôi đã không sử dụng nó cho đến nay khi 'networkInfo.isAvailable()' xuất hiện để trả về 'false' nếu mạng đang chuyển vùng và người dùng đã vô hiệu hóa Chuyển vùng dữ liệu. Ứng dụng sẽ chỉ có ở Vương quốc Anh - tôi không nghĩ ** điều này có ảnh hưởng đến mã mà tôi có cho đến nay, nhưng nếu tôi thực hiện một số kiểm tra trong câu trả lời, tôi sẽ phải kiểm tra NETWORK_TYPE khác . –

+0

Tôi tò mò. Tôi đã duyệt qua mã nguồn và tài liệu. isNetworkAvilable là đáng tin cậy như bất kỳ, vì nó kiểm tra nếu bạn đang ở trong mạng gia đình hay không. (sau khi tất cả nếu nó không thành công, ứng dụng của bạn không phải là người duy nhất gặp rắc rối;)) –

Trả lời

6

Người dùng có thể thay đổi cài đặt trong khi ứng dụng nền của bạn đang chạy. API đề xuất rằng bạn lắng nghe thông điệp phát sóng:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

Có lẽ bạn đang kiểm tra cm.getBackgroundDataSetting() trước khi gửi dữ liệu và tôi nghi ngờ điều này là đủ. Tuy nhiên, việc nghe tin nhắn quảng bá sẽ cho phép bạn tiếp tục gửi dữ liệu nền khi cài đặt được thay đổi.

Tôi tin rằng việc nghe tin nhắn quảng bá hoặc kiểm tra cài đặt trước khi gửi dữ liệu sẽ đủ. Android docs đề xuất tên cũ.

+0

Tôi có một lớp mở rộng 'BroadcastReceiver' để thực hiện tải xuống. Sau đó tôi đặt báo thức bằng cách sử dụng 'AlarmManager' để kích hoạt tải xuống nền. Mỗi khi người nhận được kích hoạt nó thực hiện các kiểm tra trong bài viết của tôi. Tôi cho rằng tôi cũng có thể nghe thông điệp phát sóng mà bạn đề xuất để nếu cập nhật nền đã bị tắt và vừa được bật lại, tôi có thể kích hoạt tải xuống ngay lập tức. Hoặc tôi chỉ có thể đợi cho lần tải xuống được lên lịch tiếp theo xảy ra. Tôi đoán tôi phải đưa ra quyết định thiết kế ... cảm ơn cho bài đăng. –

6

Ngoài ra để kiểm tra của bạn tôi cũng kiểm tra cho chuyển vùng quốc cho mạng 3g:

NetworkInfo info = m_connectivityManager.getActiveNetworkInfo(); 
int netType = info.getType(); 
int netSubtype = info.getSubtype(); 

if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_WIMAX) 
{ 
    //no restrictions, do some networking 
} 
else if (netType == ConnectivityManager.TYPE_MOBILE && 
    netSubtype == TelephonyManager.NETWORK_TYPE_UMTS) 
{ 
    //3G connection 
    if(!m_telephonyManager.isNetworkRoaming()) 
    { 
     //do some networking 
    }  
} 

ứng dụng của tôi sử dụng rất nhiều dữ liệu, vì vậy tôi không cho phép dữ liệu tải trên các mạng di động không phải 3g.

+0

Cách tiếp cận thú vị, cảm ơn bài đăng. Sẽ không '! M_telephonyManager.isNetworkRoaming()' ngăn tải xuống ngay cả khi người dùng đã đánh dấu vào hộp để cho phép Chuyển vùng dữ liệu? –

+0

Nếu bạn chưa chọn 'Chuyển vùng dữ liệu' trong cài đặt, không ai có thể sử dụng mạng di động khi đang chuyển vùng. Nhưng trong trường hợp của tôi, tôi cần phải ngăn chặn việc sử dụng mạng nặng ngay cả khi chuyển vùng được bật (đối với các yêu cầu 'ánh sáng' mà tôi không thực hiện kiểm tra chuyển vùng này). Vì vậy, có, điều này sẽ vô hiệu hóa hoạt động mạng của ứng dụng ngay cả khi chuyển vùng thiết bị được bật. – inazaruk

2

Giống như @inazaruk, tôi cũng đang cố gắng ngăn chặn (đối với người dùng có thể tốn kém) chuyển mạng khi chuyển vùng hoặc tải xuống hình ảnh trong khi chỉ trên GPRS. Do đó trong Zwitscher, tôi đã triển khai NetworkHelper để kiểm tra tùy chọn người dùng trên trạng thái roma và trạng thái mạng tối thiểu; https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/helper/NetworkHelper.java Tùy chọn đối sánh ở đây: https://github.com/pilhuhn/ZwitscherA/blob/master/res/xml/preferences.xml#L30

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