私が設計しているAndroidアプリケーションでは、デバイスがルーターに接続されている場合にのみサービスを実行する必要があります(明らかにWiFi経由)。Androidは初めてです。私はこれまでのところ、私をAchieveに永遠に連れて行ってくれたので、いくつかの指針を本当に望んでいます。
私のサービスは、電話が起動したときに起動するように設定されています。また、アクティビティが起動されると、サービスが実行されているかどうかがチェックされ、実行されていない場合は開始されます。 WiFi状態が失われた場合にサービスをオフにするためにサービスにどのコードを入れることができるのか、そしてWiFi接続がアクティブになったときにサービスを開始するために必要なコードは何ですか?
ありがとう! :)
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
パッケージの名前に)。
@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
}
}
}
これをアクティビティのプライベートクラスにし、アクティビティの作成時にレシーバーを登録し、アクティビティの破棄時に登録を解除することができます。
より有用な情報がここに提供されます: 接続ステータスの決定と監視
サプリカントのWifi状態が正常/正常であるときにサービスを開始/停止するには:
だからあなたの放送受信機を受信するように登録してください 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);
}
}
}