如何使 IntentService 等到 BroadcastReceiver 完成执行



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

我正在使用WifiManager.WIFI_STATE_CHANGED_ACTION上的广播接收器来监听WiFi的变化。

问题:

当我通过wifiManager.setWifiEnabled(true)打开WiFi时,广播接收器仅接收状态WifiManager.WIFI_STATE_DISABLEDWifiManager.WIFI_STATE_ENABLING。然后,在接收实际WifiManager.WIFI_STATE_ENABLED状态之前销毁 IntentService

如果我把Thread.sleep(2000)放在onHandleIntent()结束时,它会起作用,但一定有更好的解决方案吗?

问题:

  1. 为什么当我打电话给wifiManager.setWifiEnabled(true)时,状态WifiManager.WIFI_STATE_DISABLED广播?
  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);
        }
    }
}

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

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

相反:

  • BroadcastReceiver移至清单中注册的,最初已禁用
  • 如果IntentService确定需要等待WiFi,请通过PackageManagersetComponentEnabledSetting()启用现有BroadcastReceiver,然后退出onHandleIntent()
  • 一旦WiFi准备就绪,BroadcastReceiver将使用startService()发送命令,由您的IntentService处理,此时它可以通过PackageManagersetComponentEnabledSetting()禁用自己

最新更新