3

我有一个IntentService ,它应该在打开 WiFi执行一些任务。

我正在使用BroadcastReceiverWifiManager.WIFI_STATE_CHANGED_ACTION监听 WiFi 的变化。

问题:

当我通过BroadcastReceiver打开 WiFi 时wifiManager.setWifiEnabled(true),只接收状态和. 然后在接收到实际状态之前销毁IntentService 。WifiManager.WIFI_STATE_DISABLEDWifiManager.WIFI_STATE_ENABLINGWifiManager.WIFI_STATE_ENABLED

如果我把它放在Thread.sleep(2000)最后onHandleIntent()它有效,但必须有更好的解决方案?

问题:

  1. 为什么WifiManager.WIFI_STATE_DISABLED我打电话时会广播状态wifiManager.setWifiEnabled(true)
  2. 我怎样才能让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);
        }
    }
}
4

1 回答 1

1

如何让 onHandleIntent() 方法等到状态 WifiManager.WIFI_STATE_ENABLED 被检索到?

理想情况下,您不会,因为 WiFi 可能不可用,因此您可能永远不会收到这样的广播。

反而:

  • 将您移动BroadcastReceiver到清单中注册的人,最初是禁用的
  • 如果IntentService确定它需要等待 WiFi,让它启用现有的BroadcastReceivervia PackageManagerand setComponentEnabledSetting(),然后返回 out ofonHandleIntent()
  • 一旦 WiFi 准备就绪,BroadcastReceiver它将startService()用于发送要由您处理的命令IntentService,此时它可以通过PackageManager和禁用自身setComponentEnabledSetting()
于 2012-09-16T19:02:44.527 回答