web-dev-qa-db-ja.com

Android:WiFiの状態に応じてサービスを停止/開始しますか?

私が設計しているAndroidアプリケーションでは、デバイスがルーターに接続されている場合にのみサービスを実行する必要があります(明らかにWiFi経由)。Androidは初めてです。私はこれまでのところ、私をAchieveに永遠に連れて行ってくれたので、いくつかの指針を本当に望んでいます。

私のサービスは、電話が起動したときに起動するように設定されています。また、アクティビティが起動されると、サービスが実行されているかどうかがチェックされ、実行されていない場合は開始されます。 WiFi状態が失われた場合にサービスをオフにするためにサービスにどのコードを入れることができるのか、そしてWiFi接続がアクティブになったときにサービスを開始するために必要なコードは何ですか?

ありがとう! :)

21
user873578

Wi-Fi接続の変更を処理する 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パッケージの名前に)。

27
Phil

@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
        }
    }
}

これをアクティビティのプライベートクラスにし、アクティビティの作成時にレシーバーを登録し、アクティビティの破棄時に登録を解除することができます。

7
Maggie

より有用な情報がここに提供されます: 接続ステータスの決定と監視

2
Mario Kutlev

サプリカントのWifi状態が正常/正常であるときにサービスを開始/停止するには:

  • broadcastReceiverを登録して、WIFI状態変更のブロードキャストインテントを受信します
  • broadCastReceiver内でインテントの有効性を確認してから、サービスを開始します

だからあなたの放送受信機を受信するように登録してください 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);
       }
    }

}
1
Emmanuel Devaux