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

21 service android wifi

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

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

谢谢!:)

Phi*_*hil 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);
           }
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

(更改MyService为您的服务名称).

此外,在您的AndroidManifest,您需要添加以下行:

<receiver android:name="com.example.android.NetWatcher">
     <intent-filter>
          <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
     </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

(更改com.example.android为包的名称).

  • 谢谢!这是我的解决方案的基础.NetWatcher类正是我所需要的 - 但是如果移动数据连接打开,则此解决方案报告为真(服务仅需要在WiFi处于活动状态时运行,而不是移动数据).解决方案:WifiManager wifiManager =(WifiManager)this.getSystemService(Context.WIFI_SERVICE); if(wifiManager.isWifiEnabled()){// start service} else {// stop service} (2认同)

Mag*_*gie 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将此作为活动的私有类,并在活动创建时注册接收器,并在活动销毁时取消注册.