2012-09-16 65 views
3

我有一個IntentService它應該執行之後的一些任務WiFi已被打開。如何讓IntentService等到BroadcastReceiver完成執行?

我正在使用BroadcastReceiver on WifiManager.WIFI_STATE_CHANGED_ACTION來偵聽WiFi更改。

問題:

當我通過wifiManager.setWifiEnabled(true)開啓WLAN的廣播接收器只接收狀態WifiManager.WIFI_STATE_DISABLEDWifiManager.WIFI_STATE_ENABLING。然後,在可以接收到實際的WifiManager.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); 
     } 
    } 
} 

回答

1

我怎樣才能讓直到狀態WifiManager.WIFI_STATE_ENABLED已檢索onHandleIntent()方法等待?

理想情況下,你不這樣做,因爲WiFi可能不可用,所以你可能永遠不會收到這樣的廣播。

相反:

  • 將您BroadcastReceiver是一個在清單中註冊,先禁用
  • 如果IntentService決定了它需要等待無線網絡,都使其能夠通過PackageManagersetComponentEnabledSetting()現有BroadcastReceiver ,然後返回onHandleIntent()
  • BroadcastReceiver將使用startService()發送一個命令,一旦WiFi準備就緒,您的IntentService將在此處指向一個點t它可以通過PackageManagersetComponentEnabledSetting()
+0

我認爲這是不正確的。無論WiFi網絡是否可用,開啓WiFi時都會發送廣播「WifiManager.WIFI_STATE_ENABLED」。我想你的意思是'WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION',它表明它是否連接。 – jenzz

+0

除此之外,感謝您的回答!但是,您的解決方案意味着我的IntentService被銷燬一次,然後重新啓動。我不能這樣做,因爲我正在執行決定進一步應用程序流程的'onDestroy()'方法中的關鍵命令。任何機會等待啓用WiFi而不會破壞'IntentService'? – jenzz

+0

@Jens:首先,代碼不應該駐留在'onDestroy()'中。 IntentService的主要作用是在後臺線程中工作(例如'onHandleIntent()')。像所有生命週期方法一樣,onDestroy()在主應用程序線程上被調用。如果你將它移動到'onHandleIntent()',你也可以在需要的時候只執行那些代碼(也就是說,只有在你根據WiFi可用性進行工作的情況下)。 – CommonsWare