【问题标题】:How can I catch the event of wifi state changes如何捕捉 wifi 状态变化的事件
【发布时间】:2014-02-21 05:00:14
【问题描述】:

我正在开发一个电源控制小部件,其中我有一个 ImageButton,当按下它时会切换 Wifi 并更改按钮的 src 以进行视觉确认。问题是我不知道如何检测 Wifi 何时从其他来源(如设置或其他电源控制小部件)禁用或启用,并相应地更改按钮的 src。

例如,如果我在主屏幕上有我的小部件和 Android 默认电源控制小部件,并且我使用我的小部件禁用了 Wifi,那么 Android 默认电源控制小部件的 Wifi 按钮也会被禁用,但如果我使用电源控制小部件禁用了 wifi,我的 wifi 按钮的 src 没有改变,仍然表明 wifi 已启用。

感谢任何想法,因为我找不到解决方案。

编辑: 这是我的广播接收器:

public void onReceive(Context context, Intent intent) {

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
    wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    int state = wifi.getWifiState();
    switch(state) {
        case WifiManager.WIFI_STATE_DISABLED:
            remoteViews.setImageViewResource(R.id.widget_wifi, R.drawable.ic_widget_wifi_off);
            break;
        case WifiManager.WIFI_STATE_ENABLED:
            remoteViews.setImageViewResource(R.id.widget_wifi, R.drawable.ic_widget_wifi_on);
            break;
        case WifiManager.WIFI_STATE_DISABLING:
            remoteViews.setImageViewResource(R.id.widget_wifi, R.drawable.ic_widget_wifi_off);
            break;
        case WifiManager.WIFI_STATE_ENABLING:
            remoteViews.setImageViewResource(R.id.widget_wifi, R.drawable.ic_widget_wifi_on);
            break;
    }           


}

还有AndroidManifest.xml:

<receiver
android:name="WidgetIntentReceiver"
    android:label="widgetBroadcastReceiver" >
    <intent-filter>             
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        <action android:name="android.net.wifi.STATE_CHANGE" />             
</intent-filter>

和权限:

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

【问题讨论】:

标签: android android-wifi


【解决方案1】:

通过在清单中注册BroadcastReceiver 来收听系统广播,例如ACCESS_NETWORK_STATEACCESS_WIFI_STATE

要收听这些系统广播,您需要在清单中声明权限。有关广播操作和所需的相应权限,请参阅 this 文档。

我希望您知道如何实现广播接收器。

【讨论】:

  • 我已经有一个广播接收器。我已经编辑了我的问题以包含 onCreate 方法。这不应该工作吗?据我了解,当wifi状态发生变化时,我有意图过滤器android.net.wifi.WIFI_STATE_CHANGED应该触发广播接收器的onCreate方法。
  • 它应该可以工作,我找不到它不工作的理由。您是否添加了断点或日志命令以检查是否实际调用了 onRecieve
  • 我成功了。正在调用 onReceive 方法,但问题是在开关盒中的图像更改后,我没有在 AppWidgetProvide 类中推送小部件更新。感谢您为我指明正确的方向。
【解决方案2】:
public boolean checkOnlineState() {
        ConnectivityManager CManager =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo NInfo = CManager.getActiveNetworkInfo();
        if (NInfo != null && NInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
    }

【讨论】:

  • 好的,既然这是一个小部件,我应该在哪里调用这个方法?另外,这不是检查设备是否正在连接/已连接到网络吗?我对此不感兴趣。我只想知道它何时从我的小部件以外的其他来源启用/禁用。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多