2017-01-22 8 views
1

Я собираюсь создать приложение для Android, которое записывает все, что происходит с адаптерами WiFi для устройств. Например, включение/выключение WiFi, подключение к устройству/выход из диапазона WiFi-маршрутизатора и т. Д. Мое приложение должно иметь возможность записывать эти события сразу после включения устройства. Очистка приложения от RECENTS не должна влиять на способность приложения записывать эти события. Я прошел через BroadcastReceiver. Он привязан к жизненному циклу приложения и, следовательно, не будет записывать события после того, как приложение очистится от RECENTS.Уведомление об изменении состояния WiFi на устройстве Android?

public class MainActivity extends Activity { 
    BroadcastReceiver mybroadcastReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mybroadcastReceiver = new WifiBroadcastReceiver(this); 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
     registerReceiver(mybroadcastReceiver, intentFilter); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(mybroadcastReceiver); 
    } 
} 

public class WifiBroadcastReceiver extends BroadcastReceiver { 
    final String TAG = "WifiBroadcastReceiver"; 
    final String desiredMacAddress = "02:17:1c:96:42:fa"; 
    Activity activity; 

    WifiBroadcastReceiver(Activity activity) { 
     this.activity = activity; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { 
      SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); 

      if (SupplicantState.isValidState(state) && state == SupplicantState.COMPLETED) 
       checkConnectedToDesiredWifi(); 
     } 
    } 

    /** Detect you are connected to a specific network. */ 
    private void checkConnectedToDesiredWifi() { 
     WifiManager myWifiManager = (WifiManager)activity.getSystemService(Context.WIFI_SERVICE); 
     WifiInfo wifiInfo = myWifiManager.getConnectionInfo(); 

     if (wifiInfo != null) { 
      // get current router MAC address 
      String bssid = wifiInfo.getBSSID(); 

      if (desiredMacAddress.equals(bssid)) 
       Log.d(TAG, "Connected to " + bssid + " i.e., desiredMacAddress"); 
      else 
       Log.d(TAG, "Connected to " + bssid + " not " + desiredMacAddress); 
     } 
    } 
} 

ответ

0

Одним из решений может быть, чтобы запустить BroadcastReceiver от службы, которая не зависит от жизненного цикла любой деятельности.

1) Объявить состояние сети использование разрешений в манифесте

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

1) Создать класс обслуживания

public class WifiService extends Service { 

    private BroadcastReceiver mReceiver; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     // When creating the service, register a broadcast receiver 
     // to listen for network state changes 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 

     mReceiver = new WifiReceiver(); 
     registerReceiver(mReceiver, filter); 
     return null; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     // Unregister the receiver when unbinding the service 
     unregisterReceiver(mReceiver); 
     mReceiver = null; 
     return super.onUnbind(intent); 
    } 
} 

2) Создание BroadcastReceiver

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 

     boolean isConnected = networkInfo != null && 
           networkInfo.isConnectedOrConnecting(); 

     if (isConnected) { 
      switch (networkInfo.getType()) { 
       case ConnectivityManager.TYPE_WIFI: 
        // Connected via wifi 
        checkConnectedToDesiredWifi(); 
        break; 

       case ConnectivityManager.TYPE_ETHERNET: 
        // Connected via ethernet 
        break; 

       case ConnectivityManager.TYPE_MOBILE: 
        // Connected via mobile data 
        break; 
      } 
     } 
    } 

    private void checkConnectedToDesiredWifi() { 
     // ... 
    } 
} 

3) Объявить служба в манифесте

<service android:name=".receivers.WifiService" 
      android:stopWithTask="false" 
      android:enabled="true"/> 
+0

Будет ли это просыпаться в приложении, даже если я закрою приложение или прикрою приложение во время изменения состояния сети? @charlie – Sp4Rx

+0

Это должно позволить вашему приложению «разбудить» onReceive() намерения в вашем BroadcastReceiver даже после закрытия всех видов деятельности. Если вы выбрали, например, вы могли бы начать действие onReceive .. поэтому имитировать приложение «просыпаться», – Charlie