Saltar al contenido

Llamar a un método de actividad desde BroadcastReceiver en Android

Este post fue probado por expertos para que tengas la garantía de la veracidad de nuestra esta crónica.

Solución:

prueba este código:

su clase de receptor de transmisión para la clase perdida de Internet:

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


en su actividad, agregue esto para llamar a la transmisión:

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


INTERFAZ: ¡Mantenga el BroadCastReceiver y el código de actividad separados!

Puede crear una interfaz CallBackListener. La interfaz funcionará como un puente entre BroadcastReceiver y Activity.

1) Crear un CallbackListener

interface ConnectionLostCallback

      public void connectionLost();

 

2) Proporcionar ConnectionLostCallback en su 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) Implementar el ConnectionLostCallback en su actividad y anular el método

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

    



Enlace relevante:

Si desea saber cómo hacer que un BroadcastReceiver sea independiente de cualquier actividad, es decir, ¿cómo puede reutilizar el mismo BroadCastReceiver con diferentes actividades? Entonces LEE ESTO

Agregue una variable booleana en su actividad desde donde está abierto alertdialog

boolean isDialogOpened = false;

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

Y reemplace su código para alertdialog con este

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();

Calificaciones y reseñas

Si te ha sido de utilidad nuestro artículo, agradeceríamos que lo compartas con otros entusiastas de la programación de esta manera nos ayudas a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *