0

Je l'ai fait ce récepteur wifi où je veux faire une action lorsque le wifi est activé ...Android Wifi Récepteur radio réponse tardive

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     WifiManager wManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 
     if (isWifiEnabled(wManager)) { 
      new MyTask().execute(); 
     } 
    } 

    public static boolean isWifiEnabled(WifiManager wifi) { 
     if (wifi==null) return false; 
     if (wifi.getWifiState()!= wifi.WIFI_STATE_ENABLED) return false; 
     return true; 
    } 
} 

... et ceci est mon manifeste pour le récepteur ..

<receiver android:enabled="true" android:name=".receiver.WifiReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
    <intent-filter> 
     <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</receiver> 

... mais le récepteur effectue la tâche trop tard (environ 10-60 secondes ou plus) à partir de la commutation wifi.

Où est mon erreur? Il existe une autre méthode pour faire cela sans utiliser un service?

+0

Pouvez-vous essayer STATE_CHANGE au lieu de WIFI_STATE_CHANGED? Je ne suis pas sûr à 100% que cela réduise le temps, mais dans mes applications je l'utilise donc peut-être essayer – PsyGik

+0

Aussi, pouvez-vous poster des journaux où exactement cela prend du temps pour exécuter la tâche? – PsyGik

+0

il reçoit l'intention du système en retard je pense. Maintenant, j'essaie STATE_CHANGE –

Répondre

1

lors de l'enregistrement du récepteur, utilisez le filtre que l'intention WifiManager.WIFI_STATE_CHANGED_ACTION

BroadcastReceiver wifiStateChangeReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     final String action = intent.getAction(); 

     if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 
      WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      //your code  
     } 
    } 
}; 

vous devez enregistrer votre récepteur de radiodiffusion en onCreate ou méthodes onStart comme celui-ci

wifiStateChangeFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 
    registerReceiver(wifiStateChangeReceiver, wifiStateChangeFilter); 

mais assurez-vous la désinscription les récepteurs une fois le travail terminé.Si vous vous enregistrez dans la méthode oncreate(), vous devez unRegister() dans la méthode onDestroy(). Si vous vous enregistrez dans OnStart(), vous devez vous désinscrire dans la méthode OnStop().