我有一個IntentService它應該執行之後的一些任務WiFi已被打開。如何讓IntentService等到BroadcastReceiver完成執行?
我正在使用BroadcastReceiver on WifiManager.WIFI_STATE_CHANGED_ACTION
來偵聽WiFi更改。
問題:
當我通過wifiManager.setWifiEnabled(true)
開啓WLAN的廣播接收器只接收狀態WifiManager.WIFI_STATE_DISABLED
和WifiManager.WIFI_STATE_ENABLING
。然後,在可以接收到實際的WifiManager.WIFI_STATE_ENABLED
狀態之前,銷燬。
如果我把Thread.sleep(2000)
放在onHandleIntent()
的末尾就行了,但是一定有更好的解決辦法嗎?
問題:
- 爲什麼狀態
WifiManager.WIFI_STATE_DISABLED
在所有的時候我打電話wifiManager.setWifiEnabled(true)
時間播出? - 如何使
onHandleIntent()
方法等待狀態WifiManager.WIFI_STATE_ENABLED
已被檢索?
代碼:
public class BackupService extends IntentService {
private BroadcastReceiver mWifiStateChangedReceiver;
public BackupService() {
super("BackupService");
}
@Override
protected void onHandleIntent(Intent intent) {
final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
mWifiStateChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int wifiState = intent.getIntExtra(
WifiManager.EXTRA_WIFI_STATE,
WifiManager.WIFI_STATE_UNKNOWN);
if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
// PERFORM TASK...
}
}
};
registerReceiver(mWifiStateChangedReceiver, new IntentFilter(
WifiManager.WIFI_STATE_CHANGED_ACTION));
wifiManager.setWifiEnabled(true);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mWifiStateChangedReceiver != null) {
unregisterReceiver(mWifiStateChangedReceiver);
}
}
}
我認爲這是不正確的。無論WiFi網絡是否可用,開啓WiFi時都會發送廣播「WifiManager.WIFI_STATE_ENABLED」。我想你的意思是'WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION',它表明它是否連接。 – jenzz
除此之外,感謝您的回答!但是,您的解決方案意味着我的IntentService被銷燬一次,然後重新啓動。我不能這樣做,因爲我正在執行決定進一步應用程序流程的'onDestroy()'方法中的關鍵命令。任何機會等待啓用WiFi而不會破壞'IntentService'? – jenzz
@Jens:首先,代碼不應該駐留在'onDestroy()'中。 IntentService的主要作用是在後臺線程中工作(例如'onHandleIntent()')。像所有生命週期方法一樣,onDestroy()在主應用程序線程上被調用。如果你將它移動到'onHandleIntent()',你也可以在需要的時候只執行那些代碼(也就是說,只有在你根據WiFi可用性進行工作的情況下)。 – CommonsWare