在我正在设计的Android应用程序中,我的服务只需要在设备连接到路由器时运行(显然通过WiFi)。 我对android很新,到目前为止我所拥有的东西已经让我永远实现了,所以我真的希望得到一些指示。
我的服务设置为在手机启动时启动。此外,当Activity启动时,它会检查服务是否正在运行 - 如果没有,则启动它。 我只是想知道如果WiFi状态丢失,我可以将什么代码放入我的服务中以使其关闭 - 以及一旦WiFi连接变为活动状态我需要使用什么代码才能启动服务?
谢谢! :)
答案 0 :(得分:27)
您可以创建一个处理wifi连接更改的BroadcastReceiver。
更确切地说,你需要创建一个类 - 比如说NetWatcher:
public class NetWatcher extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//here, check that the network connection is available. If yes, start your service. If not, stop your service.
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
if (info.isConnected()) {
//start service
Intent intent = new Intent(context, MyService.class);
context.startService(intent);
}
else {
//stop service
Intent intent = new Intent(context, MyService.class);
context.stopService(intent);
}
}
}
}
(将MyService
更改为您的服务名称。)
此外,在AndroidManifest
中,您需要添加以下行:
<receiver android:name="com.example.android.NetWatcher">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
(将com.example.android
更改为您的包名称。)
答案 1 :(得分:7)
正如@Phil所说,你应该扩展BroadcastReceiver,并在onReceive方法中启动或停止服务。类似的东西:
class ConnectionChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
//start service
} else {
//stop service
}
}
}
您可以将此作为您活动的私有类,并在活动创建时注册接收者,并在活动销毁时取消注册。
答案 2 :(得分:2)
此处提供了更多有用的信息:Determining and Monitoring the Connectivity Status
答案 3 :(得分:1)
当请求者Wifi状态正常时,启动/停止服务/ nok:
请注册您的广播接收器以接收WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION
。
添加权限android.permission.CHANGE_WIFI_STATE
或android.permission.ACCESS_NETWORK_STATE
。我不确定是否有必要。
然后样本广播接收者代码可以是:
public class MyWifiStatereceiver extends BroadcastReceiver {
//Other stuff here
@Override
public void onReceive(Context context, Intent intent) {
Intent srvIntent = new Intent();
srvIntent.setClass(MyService.class);
boolean bWifiStateOk = false;
if (WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.equals(intent.getAction()) {
//check intents and service to know if all is ok then set bWifiStateOk accordingly
bWifiStateOk = ...
} else {
return ; // do nothing ... we're not in good intent context doh !
}
if (bWifiStateOk) {
context.startService(srvIntent);
} else {
context.stopService(srvIntent);
}
}
}