首页 > 解决方案 > 从后台服务切换 WIFI

问题描述

我需要让我的服务在按下按钮时切换 Wifi。我发现这段代码是一个可行的解决方案

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(!wifiManager.isWifiEnabled());

加上适当的权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

但是,从后台服务运行该代码会导致服务冻结!没有任何捕获的异常的异常行为。

我最好的解决方案是将服务中的 Intent 发送到一个空活动以从那里启动 Wifi(它可以工作!)但是为什么直接从服务启动它不起作用?

标签: javaandroidandroid-service

解决方案


服务在主线程中运行,适合长时间操作,与 UI 没有交互,任何冻结 UI 的事情都应该在后台完成。最好从 Service 发送广播,而您的广播接收器处理代码。作为示例,您可以查看:服务广播接收器,您可以在其中添加:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            wifiManager.setWifiEnabled(!wifiManager.isWifiEnabled());
        }
    };

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(broadcastReceiver, new IntentFilter(STR_RECEIVER));
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(broadcastReceiver);
}

并从 Service 发送广播:

Intent intent = new Intent(STR_RECEIVER);
sendBroadcast(intent);

推荐阅读