2017-02-18 1 views
1

Je souhaite configurer dynamiquement un BroadcastReceiver pour vérifier si je suis en ligne UNIQUEMENT lorsque mon application est en cours d'exécution au premier plan. Au sein de ma classe principale, j'ai créé un An Intent Filter, une classe BroadcastReceiver imbriquée et finalement enregistré/désenregistré le récepteur dans les méthodes onResume et onPause respectivement.Dynamic BroadcastReceiver pour vérifier la connectivité en ligne

Ma question est la suivante: y a-t-il une intention que je peux ajouter à mon filtre d'intention qui vérifie la connectivité en ligne?

Si ce n'est pas le cas, comment puis-je créer ce récepteur de diffusion dynamique pour effectuer uniquement lorsque mon application est en cours d'exécution?

Voici ce que ma classe ressemble ....

public class MainActivity extends AppCompatActivity { 
private IntentFilter onlineIntentFilter; 
private CheckOnlineReceiver checkOnlineReceiver; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    onlineIntentFilter = new IntentFilter(); 
    checkOnlineReceiver = new CheckOnlineReceiver(); 
    //*****WHAT INTENT ACTION CAN I PASS TO CHECK NETWORK CONNECTIVITY****** 
    onlineIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); 

    } 

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(checkOnlineReceiver, onlineIntentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(checkOnlineReceiver); 
} 


private class CheckOnlineReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     Toast.makeText(getApplicationContext(),"IN METHOD, ACTION = " + action, Toast.LENGTH_LONG).show(); 
    } 
}} 

Répondre

1

Ajouter une action de connectivité onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)

et ne pas oublier d'ajouter l'autorisation

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

onReceive() de Le récepteur de radiodiffusion sera appelée sur le changement de connectivité qui signifie à la fois connecté et déconnecté. donc chaque fois que vous recevez le braodcast vous avez vérifier la connectivité comme ci-dessous

public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()) { 
     return true; 
    } 
    return false; 
} 
0

ajouter intentfilter CONNECTIVITY_ACTION

+0

Il est dit que cela ne peut pas être résolu. Voici ce que j'ai ajouté: onlineIntentFilter.addAction (Intent.CONNECTIVITY_ACTION); –

1

Voici la méthode standard pour le faire.

Créer une interface qui aura deux méthodes onNetworkConnected() et onNetworkDisconnected()

public interface NetworkConnectivityListener { 
    public void onNetworkConnected(); 
    public void onNetworkDisconnected(); 
} 

Toute classe qui veut écouter les changements de réseau implémenter cette interface et passer outre ses deux méthodes.

Créez une classe qui étendra BroadcastReceiver et onReceive() de ce récepteur capturera les changements de connectivité. Dans cette classe, créer une fonction pour enregistrer les auditeurs

public class NetworkBroadcastReceiver extends BroadcastReceiver { 

private NetworkConnectivityListener listener; 

public NetworkBroadcastReceiver(NetworkConnectivityListener listener) { 
    this.listener = listener; 
} 

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

    if (listener != null) { 
     if (isConnectedToInternet()) { 
      listener.onNetworkConnected(); 
     } else { 
      listener.onNetworkDisconnected(); 
     } 
    } 
} 

PS, vous pouvez facilement vérifier si votre appareil est connecté à Internet ou non. Juste google. Maintenant, disons que vous voulez que votre MainActivity écoute les changements de netwrork, tout ce que vous avez à faire est d'implémenter le NetworkConnectivityListener dans votre appel d'activité principal et créer une instance du NetworkBroadcastReceiver en passant le contexte de MainActivity et il commencera à obtenir le mises à jour du réseau.

0

Vous devez créer un service que vous cherchez à effectuer une tâche de longue durée en arrière-plan.

Un service devra être enregistré dans le manifeste, au sein des balises <application>.

<service android:name=".WifiService" 
     android:stopWithTask="true" 
     android:enabled="true"/> 

stopWithTask provoque le service à détruire lorsque toutes vos activités sont détruites (la valeur par défaut est true).

Vous devrez enregistrer et annuler l'inscription d'un BroadcastReceiver à l'action CONNECTIVITY_CHANGE dans la classe de service.

public class WifiService extends Service { 

    private BroadcastReceiver mReceiver; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 

     // Your BroadcastReceiver class 
     mReceiver = new WifiReceiver(); 
     registerReceiver(mReceiver, filter); 
     return null; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     unregisterReceiver(mReceiver); 
     return super.onUnbind(intent); 
    } 
} 

Ensuite, dans BroadcastReceiver, vous devez écouter CONNECTIVITY_CHANGE.

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 
        break; 

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

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

Avec cette configuration, vous serez en mesure d'informer les composants de votre application sur les changements de connectivité.