如何让IntentService等到BroadcastReceiver完成执行?

时间:2012-09-16 15:23:43

标签: android broadcastreceiver android-wifi intentservice

我有一个 IntentService ,它应该在启用WiFi之后执行一些任务。

我在WifiManager.WIFI_STATE_CHANGED_ACTION上使用 BroadcastReceiver 来侦听WiFi更改。

问题:

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

如果我将Thread.sleep(2000)放在onHandleIntent()的末尾,那么它有效,但必须有更好的解决方案吗?

问题:

  1. 当我打电话给WifiManager.WIFI_STATE_DISABLED时,为什么状态wifiManager.setWifiEnabled(true)会被广播?
  2. 如何让onHandleIntent()方法等到状态WifiManager.WIFI_STATE_ENABLED被检索到?
  3. 代码:

    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);
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

  

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

理想情况下,您没有,因为WiFi可能无法使用,因此您可能永远不会收到此类广播。

相反:

  • 将您的BroadcastReceiver移至清单中注册的,最初已停用
  • 如果IntentService确定需要等待WiFi,请让它通过BroadcastReceiverPackageManager启用现有setComponentEnabledSetting(),然后返回onHandleIntent() }
  • 一旦WiFi准备就绪,BroadcastReceiver将使用startService()发送一个由IntentService处理的命令,然后它可以通过PackageManager自行禁用setComponentEnabledSetting()