我有一个IntentService,它应该在WiFi打开后执行一些任务。
我正在使用WifiManager.WIFI_STATE_CHANGED_ACTION
上的广播接收器来监听WiFi的变化。
问题:
当我通过wifiManager.setWifiEnabled(true)
打开WiFi时,广播接收器仅接收状态WifiManager.WIFI_STATE_DISABLED
和WifiManager.WIFI_STATE_ENABLING
。然后,在接收实际WifiManager.WIFI_STATE_ENABLED
状态之前销毁 IntentService。
如果我把Thread.sleep(2000)
放在onHandleIntent()
结束时,它会起作用,但一定有更好的解决方案吗?
问题:
- 为什么当我打电话给
wifiManager.setWifiEnabled(true)
时,状态WifiManager.WIFI_STATE_DISABLED
广播? - 如何使
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);
}
}
}
如何使 onHandleIntent() 方法等到检索到状态WifiManager.WIFI_STATE_ENABLED?
理想情况下,您不会,因为 WiFi 可能不可用,因此您可能永远不会收到这样的广播。
相反:
- 将
BroadcastReceiver
移至清单中注册的,最初已禁用 - 如果
IntentService
确定需要等待WiFi,请通过PackageManager
和setComponentEnabledSetting()
启用现有BroadcastReceiver
,然后退出onHandleIntent()
- 一旦WiFi准备就绪,
BroadcastReceiver
将使用startService()
发送命令,由您的IntentService
处理,此时它可以通过PackageManager
和setComponentEnabledSetting()
禁用自己