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