3

WiFiがオンになった後にいくつかのタスクを実行する必要があるIntentServiceがあります。

BroadcastReceiverをオンにしてWifiManager.WIFI_STATE_CHANGED_ACTIONWiFiの変更をリッスンしています。

問題:

BroadcastReceiverwifiManager.setWifiEnabled(true)経由でWiFiをオンにすると、状態とがのみ受信されます。次に、実際の状態を受信する前に、 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

状態WifiManager.WIFI_STATE_ENABLEDが取得されるまでonHandleIntent()メソッドを待機させるにはどうすればよいですか?

理想的には、WiFiが利用できない可能性があり、そのようなブロードキャストを受信できない可能性があるため、受信しないでください。

その代わり:

  • マニフェストに登録されているものに移動BroadcastReceiverし、最初は無効にします
  • IntentServiceWi-Fiを待つ必要があると判断した場合は、既存のBroadcastReceiver経由PackageManagerとを有効にsetComponentEnabledSetting()してから、onHandleIntent()
  • は、WiFiの準備ができたら、処理するコマンドを送信するためにBroadcastReceiver使用します。その時点で、およびを介して自身を無効にすることができます。startService()IntentServicePackageManagersetComponentEnabledSetting()
于 2012-09-16T19:02:44.527 に答える