studio servicios servicio segundo saber que plano example esta corriendo como android methods android-activity broadcastreceiver static-methods

servicios - Llamar a un método de actividad de BroadcastReceiver en Android



intentservice example (3)

Aquí estoy creando una aplicación en línea que solo depende de Internet.

Entonces, siempre que haya un error de red, debe notificar al usuario. Para eso, he creado un BroadcastReciver que recibe llamadas cuando se pierde la conexión de red (Internet).

Todo esto funciona perfectamente Ahora lo que necesito es que tengo que llamar a un método de Actividad de este Receptor de Transmisión, donde he creado un Diálogo de alerta.

He leído muchas respuestas en stack-overflow.com que puedo declarar que el método estático y llamar utilizando solo el nombre de la actividad,

por ejemplo, MyActivityName.myMethod()

Pero no puedo declarar mi método estático, porque estoy usando Alert Dialogue allí y me muestra error en línea,

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

que no puede usar esto en un contexto estático .

Entonces, ¿cómo puedo llamar un método de Actividad (no debe ser estático y sin iniciar esa actividad) desde un Receptor de Transmisión?

¿Y puedo obtener el nombre de actividad (o fragmento) de Broadcast Receiver que se está ejecutando actualmente?


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


prueba este código:

su clase de receptor de difusión para la clase perdida en 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); } }


Pase el contexto de su actividad al contructor de 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 } }

y en tu actividad principal

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

Espero eso ayude