Aufrufen einer Activity-Methode von BroadcastReceiver in Android

Lesezeit: 6 Minuten

Aufrufen einer Activity Methode von BroadcastReceiver in Android
Jay Vyas

Hier erstelle ich eine Online-Bewerbung, die nur vom Internet abhängt.

Wenn also ein Netzwerkfehler auftritt, muss er den Benutzer benachrichtigen. Dafür habe ich einen BroadcastReciver erstellt, der Anrufe entgegennimmt, wenn die Netzwerkverbindung (Internet) verloren geht.

Das alles funktioniert einwandfrei. Was ich jetzt brauche, ist, dass ich eine Methode von Activity von diesem Broadcast-Empfänger aufrufen muss, wo ich einen Alert-Dialog erstellt habe.

Ich habe viele Antworten auf stack-overflow.com gelesen, in denen ich diese Methode als statisch deklarieren und aufrufen kann, indem ich nur den Aktivitätsnamen verwende.

z.B MyActivityName.myMethod()

Aber ich kann meine Methode nicht statisch deklarieren, weil ich dort Alert Dialogue verwende und es mir einen Fehler online anzeigt.

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

das Kann dies nicht in einem statischen Kontext verwenden.

Wie kann ich also eine Methode von Activity (darf nicht statisch sein und ohne diese Aktivität zu starten) von einem Broadcast-Empfänger aufrufen?

Und kann ich den Namen der Aktivität (oder des Fragments) vom derzeit ausgeführten Broadcast-Empfänger abrufen?

1641747818 771 Aufrufen einer Activity Methode von BroadcastReceiver in Android
Vijju

versuche diesen Code:

Ihre Broadcast-Empfänger-Klasse für die verlorene Internet-Klasse:

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

Fügen Sie in Ihrer Aktivität dies zum Aufrufen der Übertragung hinzu:

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

  • Vielen Dank für Ihren Code Jay, es funktioniert perfekt. Ich habe einen Code zum Erstellen von Alert Dialogue in onReceive() eingefügt. Es ist nur ein Fehler vorhanden. Immer wenn die Internetverbindung unterbrochen wird, werden sofort vier Warndialoge anstelle von einem erstellt.

    – Jay Vyas

    7. März ’14 um 5:50


  • Bitte setzen Sie eine if-Bedingung zum Öffnen von AlertDialog, wenn geöffnet, dann öffnen Sie keinen anderen. Bitte, wenn es funktioniert, akzeptieren Sie meine Antwort.

    – Vijju

    7. März ’14 um 7:11

  • AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setMessage(“Netzwerk nicht gefunden.”); alertDialog.setPositiveButton(“Check Setting”, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {}}); alertDialog.setNegativeButton(“Abbrechen”, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {}}); alertDialog.show();

    – Jay Vyas

    7. März ’14 um 7:16

  • Eine Randnotiz: das interne BroadcastReceiver darf nicht denselben Intent-Filter haben wie der externe BroadcastReceiver. Wenn dies der Fall ist, erhalten Sie eine Endlosschleife.

    – velis

    4. August ’15 um 12:10

  • Danke du hast mir Zeit gespart 🙂

    – Shahzain Ali

    28. Juli ’16 um 22:47

1641747818 650 Aufrufen einer Activity Methode von BroadcastReceiver in Android
Rohit Singh

SCHNITTSTELLE: Halten Sie BroadCastReceiver und Aktivitätscode getrennt!

Sie können eine CallBackListener-Schnittstelle erstellen. Die Schnittstelle fungiert als Brücke zwischen BroadcastReceiver und Activity.

1) Erstellen Sie einen CallbackListener

interface ConnectionLostCallback{

      public void connectionLost();

} 

2) Bereitstellung ConnectionLostCallback in Ihrem 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) Implementieren Sie die ConnectionLostCallback in Ihrer Aktivität und überschreiben Sie die Methode

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

    }


}

Relevanter Link:

Wenn Sie wissen möchten, wie Sie einen BroadcastReceiver von jeder Aktivität unabhängig machen, dh wie können Sie denselben BroadCastReceiver mit verschiedenen Aktivitäten wiederverwenden? Dann LESEN SIE DIES

  • Was ist, wenn Sie den Konstruktor nicht aufrufen können? Wenn Sie beispielsweise den AlarmManager verwenden, wird der Broadcast-Empfänger von den Methoden des Alarmmanagers aufgerufen

    – mantc_sdr

    2. Juni ’20 um 12:12

  • Dieselbe Situation, wenn Sie WLAN-Statusänderungen verfolgen möchten – das ist auf Manifestebene und Sie fangen Broadcasts auf Systemebene ab. Richten Sie in diesem Fall einen Listener ein

    – Martin

    6. Februar ’21 um 18:23

Fügen Sie eine boolesche Variable zu Ihrer Aktivität hinzu, von der aus Sie den Alertdialog öffnen

boolean isDialogOpened = false;

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

Und ersetzen Sie Ihren Code für alertdialog durch diesen

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

  • Entschuldigung, aber Ihr Code funktioniert nicht und sagt mir “NoSuchMethodException” auf alertDialog.setonDismissListenet

    – Jay Vyas

    7. März ’14 um 7:35

Übergeben Sie den Kontext Ihrer Aktivität an den Konstrukteur von 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
    }

}

und in deiner 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);
    }
}

ich hoffe es hilft

1641747818 175 Aufrufen einer Activity Methode von BroadcastReceiver in Android
mayid

Benutzen Lambdas. EIN Consumer würdest du.

protected void onCreate(Bundle savedInstanceState) {
    ...

    receiver = new LocationBroadcastReceiver((whatever) -> doSomething(whatever));
    registerReceiver(receiver, new IntentFilter("YOUR_MESSAGE"));
}

Wo doSomething wird eine Methode in deinem sein Aktivität.

class YourBroadcastReceiver extends BroadcastReceiver {

    private Consumer<Whatever> callback;

    public LocationBroadcastReceiver(Consumer<Whatever> callback) {
        this.callback = callback;
    }

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public void onReceive(Context context, Intent intent) {
            
        this.callback.accept(new Whatever());
    }
}

Ist die Alternative zu allen anderen:

deklarieren Sie diese Methode als statisch und rufen Sie sie auf, indem Sie nur den Aktivitätsnamen verwenden.

Abgesehen von dem, was Sie erklärt haben, ist das eine Art der Kopplung.

Übergeben Sie den Kontext Ihrer Aktivität an den Konstrukteur von BroadcastReceiver.

Das würde nicht funktionieren, weil Sie eine Methode aufrufen möchten, die nicht Teil von . ist AppCompatActivity. Und ja, Sie könnten niedergeschlagen sein, aber dann sind Sie an Ihre Aktivität gekoppelt.

stattdessen eine andere Sendung oder eine lokale Sendung verwenden

Nun, Sie können auf diese Weise nur an einer Reihe von Primitiven vorbeikommen. Was ist, wenn Sie ein Objekt übergeben möchten? Außerdem wird die Deklaration eines neuen BroadcastReceivers ziemlich ausführlich und möglicherweise schwer zu befolgen.

Aufrufen einer Activity Methode von BroadcastReceiver in Android
Adel Ahmad

Wie in Vijjus Antwort, aber stattdessen mit Local Broadcasts

public class SampleReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent intentToBroadcast =  new Intent("YOUR_ACTION_HERE");
        LocalBroadcastManager.getInstance(context).sendBroadcast(intentToBroadcast);
    }
}

Fügen Sie dies in Ihrer Aktivität hinzu

public class SampleActivity extends Activity {

    @Override
    protected void onResume() {
        super.onResume();
        LocalBroadcastManager.getInstance(this).registerReceiver(mSampleReceiver, new IntentFilter(YOUR_ACTION_HERE));
    }

    @Override
    protected void onPause() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mSampleReceiver);
        super.onPause();
    }

    private SampleReceiver mSampleReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // your code here
        }
    };
}

Notiz Verschieben Sie die Registrierungs-/Registrierungsaufrufe nach onCreate/onDestroy, wenn Sie benachrichtigt werden möchten, auch wenn Ihre Aktivität im Hintergrund läuft.

.

227380cookie-checkAufrufen einer Activity-Methode von BroadcastReceiver in Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy