tutorial - Chiamando un metodo di attività da BroadcastReceiver in Android




registerreceiver tutorial (2)

Qui sto creando un'applicazione online che dipende solo da Internet.

Quindi, ogni volta che si verifica un errore di rete, è necessario avvisare l'utente. Per questo, ho creato un BroadcastReciver che riceve una chiamata quando si perde la connessione di rete (Internet).

Tutto questo funziona perfettamente. Ora ciò di cui ho bisogno è che devo chiamare un metodo di attività da questo ricevitore Broadcast, in cui ho creato un dialogo di avviso.

Ho letto molte risposte su stack-overflow.com che posso dichiarare il metodo statico e chiamare utilizzando solo il nome dell'attività,

es. MyActivityName.myMethod()

Ma non posso dichiarare il mio metodo statico, perché sto usando Alert Dialogue e mi mostra l'errore on line,

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

che non può usare questo in un contesto statico .

Quindi, come posso chiamare un metodo di attività (non statico e senza avviare quell'attività) da un ricevitore Broadcast?

E posso ottenere il nome dell'attività (o del frammento) da Broadcast Receiver che è attualmente in esecuzione?

https://code.i-harness.com


Aggiungi una variabile booleana nella tua attività da dove sei alertdialog aperto

boolean isDialogOpened = false;

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

E sostituisci il tuo codice per alertdialog con questo

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

prova questo codice:

la tua classe broadcastreceiver per la classe internet persa:

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

nella tua attività aggiungi questo per chiamare la trasmissione:

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






static-methods