我有一个 IntentService ,它应该在启用WiFi之后执行一些任务。
我在WifiManager.WIFI_STATE_CHANGED_ACTION
上使用 BroadcastReceiver 来侦听WiFi更改。
问题:
当我通过wifiManager.setWifiEnabled(true)
打开WiFi时, BroadcastReceiver 只会收到状态WifiManager.WIFI_STATE_DISABLED
和WifiManager.WIFI_STATE_ENABLING
。然后在可以接收实际的WifiManager.WIFI_STATE_ENABLED
状态之前销毁 IntentService 。
如果我将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);
}
}
}
答案 0 :(得分:1)
如何让onHandleIntent()方法等到检索到WifiManager.WIFI_STATE_ENABLED状态?
理想情况下,您没有,因为WiFi可能无法使用,因此您可能永远不会收到此类广播。
相反:
BroadcastReceiver
移至清单中注册的,最初已停用IntentService
确定需要等待WiFi,请让它通过BroadcastReceiver
和PackageManager
启用现有setComponentEnabledSetting()
,然后返回onHandleIntent()
} BroadcastReceiver
将使用startService()
发送一个由IntentService
处理的命令,然后它可以通过PackageManager
自行禁用setComponentEnabledSetting()