web-dev-qa-db-fra.com

Appel d'une méthode d'activité de BroadcastReceiver sous Android

Ici, je crée une application en ligne qui ne dépend que d’Internet.

Donc, chaque fois qu'il y a une erreur de réseau, il doit en informer l'utilisateur. Pour cela, j'ai créé un BroadcastReciver qui reçoit un appel lorsque la connexion réseau est perdue (Internet).

Tout cela fonctionne parfaitement. Maintenant, ce dont j'ai besoin, c'est que je dois appeler une méthode d'activité à partir de ce récepteur de diffusion, où j'ai créé un dialogue d'alerte.

J'ai lu de nombreuses réponses sur stack-overflow.com que je peux déclarer cette méthode statique et appeler en utilisant uniquement le nom de l'activité,

par exemple MyActivityName.myMethod()

Mais je ne peux pas déclarer ma méthode statique, car j'utilise Alert Dialogue ici et cela me montre une erreur en ligne,

AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

que Ne peut pas utiliser ceci dans un contexte statique .

Alors, comment puis-je appeler une méthode d'activité (ne doit pas être statique et sans démarrer cette activité) à partir d'un récepteur de diffusion?

Et puis-je obtenir le nom d'activité (ou de fragment) de Broadcast Receiver en cours d'exécution? 

25
Jay Vyas

essayez ce code: 

votre classe broadcastreceiver pour la classe internet perdue:

public class InternetLostReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
    context.sendBroadcast(new Intent("INTERNET_LOST"));
}
}

dans votre activité, ajoutez ceci pour la diffusion d'appel:

public class TestActivity  extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    registerReceiver(broadcastReceiver, new IntentFilter("INTERNET_LOST"));
}

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // internet lost alert dialog method call from here...
    }
};

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(broadcastReceiver);
}
}
60
Vijju

Ajouter une variable booléenne dans votre activité à partir de laquelle vous êtes ouvert alertdialog 

boolean isDialogOpened = false;

// in broadcast recever check 
if(isDialogOpened) {
    alertDialog();
}

Et remplacez votre code pour alertdialog par celui-ci

public void alertDialog() {
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

    alertDialog.setMessage("Network not found.");
    alertDialog.setPositiveButton("Check Setting",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                }
            });
    alertDialog.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                }
            });

    alertDialog.setOnDismissListener(new OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
            isDialogOpened = false;
        }
    });

    alertDialog.setOnCancelListener(new OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            isDialogOpened = false;
        }
    });

    alertDialog.show();
}
4
Vijju

INTERFACE: séparez BroadCastReceiver et le code d'activité!

Vous pouvez créer une interface CallBackListener. L'interface fonctionnera comme un pont entre BroadcastReceiver et Activity

1) Créer un CallbackListener 

interface ConnectionLostCallback{

      public void connectionLost();

} 

2) Fournissez ConnectionLostCallback dans votre BroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver{

     private ConnectionLostCallback listener;

     public MyBroadcastReceiver(ConnectionLostCallback listener ){

           this.listener = listener     //<-- Initialze it

     }

     @Override
     public void onReceive(Context context, Intent intent) {

           listener.connectionLost();

     }
}

3) Implémentez la ConnectionLostCallback dans votre activité et remplacez la méthode

YourActvity extends AppcompatActivity implements ConnectionLostCallback{

    // Your Activity related code //
      //    new MyBroadcastReceiver(this);  <-- create instance

    private void showAlertMessage(){
       AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
    } 


    @Override 
    public void connectionLost(){

         showAlertMessage();          //<--- Call the method to shoe alert dialog

    }


}

Lien pertinent:

Si vous voulez savoir comment créer un BroadcastReceiver indépendamment de tout c.-à-d. comment pouvez-vous réutiliser le même BroadCastReceiver avec .__ différentes activités? Alors LISEZ CECI

0
Rohit Singh

Transmettez le contexte de votre activité au constructeur BroadcastReceiver.

public class ResponseReceiver extends BroadcastReceiver{

    MainActivity ma; //a reference to activity's context

    public ResponseReceiver(MainActivity maContext){
        ma=maContext;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ma.brCallback("your string"); //calling activity method
    }

}

et dans votre MainActivity

public class MainActivity extends AppCompatActivity {
    ...
    public void onStart(){
        ...        
    ResponseReceiver responseReceiver = new ResponseReceiver(this); //passing context
    LocalBroadcastManager.getInstance(this).registerReceiver(responseReceiver,null);
        ...
    }

    public void brCallback(String param){
        Log.d("BroadcastReceiver",param);
    }
}

j'espère que ça aide

0
0xcafebabe