App 啟動 Service 定時發送 HTTP POST,手動啟動正常(返回 200),但配置 BOOT_COMPLETED 廣播自啟後,請求拋 Unable to resolve host "...": No address associated with hostname,僅網絡請求失敗,其他功能正常。
開機廣播觸發時,系統網絡服務尚未完全就緒(Wi-Fi/移動數據未連接、DNS 未就緒)。Service 啟動即發起請求,DNS 解析失敗,拋 UnknownHostException。
private void waitForNetwork() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
int retry = 0;
while (retry++ < 30) { // 最多等 30s
NetworkInfo active = cm.getActiveNetworkInfo();
if (active != null && active.isConnected()) {
// 額外驗證 DNS
try { InetAddress.getByName("www.google.com"); break; }
catch (Exception ignored) {}
}
SystemClock.sleep(1000);
}
}
在 onCreate() 或首次請求前調用。setRequiredNetworkType(NetworkType.CONNECTED),系統自動在網絡就緒時觸發任務,**無需手動輪詢**,且符合 Doze/App Standby 省電策略(API 21+ 推薦)。CONNECTIVITY_ACTION(API 24+ 需動態註冊),收到連接廣播後再啟動定時任務。SystemClock.sleep(10000) 粗暴延遲,**不推薦**(機型差異大,不可靠)。核心教訓:**開機即聯網 = 網絡未就緒**,主動等待或交給系統調度器是正解。