今天一位國外開發者遇到他的應用在定期與 server 同步資料時,因為 2x Battery 會將網路斷開,而造成他的程式始終無法抓到資料,來信問我是否有解法。其實就算使用者沒裝 2x Battery, 手機上的網路還是隨時會處於無法連線的狀態。因此,真要寫一個定期 polling (or post) 的 app。我建議還是要寫個 broadcast receiver 監聽android.net.conn.CONNECTIVITY_CHANGE intent。如果上次同步沒成功,就可在連線恢復時,繼續上次的同步工作。
有興趣知道細節的,可先閱讀底下資料:
- http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
- http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION
原先這文章是發佈在我的 facebook, 有位網友加入討論,我覺得值得在這分享我們的討論給大家。底下就是我們的後續討論:
Julian Shen: 這Intent使用上要稍微小心, 網路有變化就會收到(像是3G<->Wifi),在網路不穩定的環境下就很容易頻繁收到, 在這份 document : http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html 有特別提到"it's good practice to monitor this broadcast only when you've previously suspended updates or downloads in order to resume them."
盧育聖: Julian Shen 你說的沒錯。
Android's DownloadManager 就是靠 CONNECTIVITY_CHANGE 來恢復網路下載的工作。想深入研究的開發者,可參考底下 Android 原始碼的實作。
- packages\providers\DownloadProvider\src\com\android\providers\downloads\DownloadReceiver.java
- packages\providers\DownloadProvider\src\com\android\providers\downloads\DownloadService.java
盧育聖: 另外補充 Julian Shen 提到的會頻繁收到 CONNECTIVITY_CHANGE intent 問題的解法。實務上,這個 receiver 預設是處於 disabled (加 android:enabled="false") 狀態的,只有當你上次同步失敗時,才 enable 這個 receiver,同步好後,記得要 disable 該 receiver。
如何動態 enable/disable receiver,請見:
http://developer.android.com/training/monitoring-device-state/manifest-receivers.html
看到這,你是否有不同的想法或解決方法?也歡迎在此一起討論。
沒有留言:
張貼留言