我有一个应用程序,只要手机连接到 WiFi,它就会更新数据库。我已经实现了一个Service
并且BroadcastReceiver
它将运行Service
(它会告诉我正在使用哪个网络),但问题是我不知道当网络状态发生变化或连接到某种类型时要在manifest
文件中添加什么来启动BroadcastReceiver
网络的
5 回答
你需要
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
在你的receiver
标签中。
或者,如果您想对其进行更多控制,请在注册之前进行BroadcastReceiver
设置:
final IntentFilter filters = new IntentFilter();
filters.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filters.addAction("android.net.wifi.STATE_CHANGE");
super.registerReceiver(yourReceiver, filters);
WIFI_STATE_CHANGED
广播<intent-action>
指示 Wi-Fi 已启用、禁用、启用、禁用或未知。一个额外的提供这种状态作为一个 int。如果可用,另一个额外提供先前的状态。
STATE_CHANGE
广播<intent-action>
指示 Wi-Fi 连接状态已更改。一个额外的以 NetworkInfo 对象的形式提供了新的状态。如果新状态为 CONNECTED,则额外的附加信息可能会提供接入点的 BSSID 和 WifiInfo。作为字符串
此外,您需要在manifest
标签内指定正确的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
要检查连接,您可以使用ConnectivityManager
它告诉您可用的连接类型。
ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
这是我在连接更改时收到通知的方法。您定义一个BroadCastReceiver
来接收广播。
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() ||
mobile != null && mobile.isConnectedOrConnecting();
if (isConnected) {
Log.d("Network Available ", "YES");
} else {
Log.d("Network Available ", "NO");
}
}
}
您还必须BroadcastReceiver
在清单文件中定义它并按ConnectivityChange
.
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
来源在这里
补充@Dantalian的回答。从 Android Nougat 开始,您不应在 Manifest 上声明您的接收器,因为它不会接收CONNECTIVITY_ACTION
广播。您应该使用该Context.registerReceiver(Receiver, Intent)
方法注册您的接收器。
链接到这里的源代码
You should make an BroadcastReceiver
that will be triggered when the connectivity status has changed :
Here Same question How to check the Internet Connection periodically in whole application?
声明要传递给广播接收器的意图过滤器
IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);
在广播接收器中,检查 EXTRA_WIFI_STATE;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action)
{
case WifiManager.WIFI_STATE_CHANGED_ACTION:
int extra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);
if(extra==WifiManager.WIFI_STATE_ENABLED)
{
}//...else WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLING
break;
}
}
};