Aufrufen einer Activity-Methode von BroadcastReceiver in Android
Lesezeit: 6 Minuten
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?
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
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
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.
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.
.
2273800cookie-checkAufrufen einer Activity-Methode von BroadcastReceiver in Androidyes