Android:停止/启动服务取决于WiFi状态?

时间:2011-08-17 14:33:47

标签: android service wifi

在我正在设计的Android应用程序中,我的服务只需要在设备连接到路由器时运行(显然通过WiFi)。 我对android很新,到目前为止我所拥有的东西已经让我永远实现了,所以我真的希望得到一些指示。

我的服务设置为在手机启动时启动。此外,当Activity启动时,它会检查服务是否正在运行 - 如果没有,则启动它。 我只是想知道如果WiFi状态丢失,我可以将什么代码放入我的服务中以使其关闭 - 以及一旦WiFi连接变为活动状态我需要使用什么代码才能启动服务?

谢谢! :)

4 个答案:

答案 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:

  • 注册BroadcastReceiver以接收WIFI状态更改广播意图
  • 在BroadCastReceiver内部检查意图有效性,然后启动您的服务

请注册您的广播接收器以接收WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION。 添加权限android.permission.CHANGE_WIFI_STATEandroid.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);
       }
    }

}