Как уведомлять, когда Wi-Fi включается ( / выключается) приложением переднего плана?

#android-intent #android-service #android-background

#android-намерение #android-сервис #android-фон

Вопрос:

Я пытаюсь запустить приложение в фоновом режиме, которое сообщает мне, когда статус Wi-Fi изменен;

 public class BackgroundJobs extends Service {

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("BACKJOBS", "here we are");
    wifiInfo wifiHandler = new wifiInfo(this);
    // wifistatus checks if wifi is on or off, returning a boolean
    if(wifiHandler.wifiStatus())
        Log.i("BACKJOBS", "WIFI ON");
    else
        Log.i("BACKJOBS", "WIFI OFF");
    return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    //TODO for communication return IBinder implementation
    return null;
}
}
  

В моем MainActivity я запускаю службу следующим образом:

 startService(new Intent(this, BackgroundJobs.class));
  

и в AndroidManifest.xml:

 <service android:name=".gestioneServizi.BackgroundJobs"/>
  

Я запускаю свое приложение, возвращаюсь к себе домой, нажимая кнопку «Домой», включаю или выключаю Wi-Fi, но я не вижу журналов «BACKJOBS».

Я что-то недопонимаю или я работаю с неправильным методом?

Ответ №1:

В этом случае вам следует использовать BroadcastReceiver.

Манифест:

    <receiver android:name="com.app.receiver.ConnectionReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
        </intent-filter>
   </receiver> 
  

Приемник:

  public class ConnectionReceiver extends BroadcastReceiver {
   private static String lastActiveNetworkName = null;
   private ConnectivityManager connectivityManager;
   private NetworkInfo wifiInfo;

   @Override
   public void onReceive(final Context context, Intent intent) {
    try {
      connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
      wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
      NetworkInfo network = connectivityManager.getActiveNetworkInfo();

     if (network != null) {
            String networkName = network.getTypeName();
            if (!networkName.equals(lastActiveNetworkName)) {
                lastActiveNetworkName = networkName;
            } else {
                Log.d(TAG, "Network equals lastnetwork:"   lastActiveNetworkName);
            }
        }

        if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

            if (networkInfo.isConnected()) {
                Log.d(TAG, "Wifi is connected: "   String.valueOf(networkInfo));
            }
        } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI amp;amp; !networkInfo.isConnected()) {
                Log.d(TAG, "Wifi is disconnected: "   String.valueOf(networkInfo));
            }
        }
}