BroadcastReceiver -> Funktionsaufruf mit Rückgabe

wolei

Mitglied
Hallo,

womöglich kann mir wer weiterhelfen. Ich suche eine Möglichkeit.
Einen Funktionsaufruf in den OnPreferenceClickListener zu machen welcher in einer Anderen Classe ein funktion ausführt.
Genauer gesagt möchte ich eine Funktion aufrufen warten bis sie Fertig ist und die ermittelten daten wieder zurück gibt. Das Problem ist in einen OnPreferenceClickListener ist das initialisieren eines Interfaces meines erachtens nach nicht möglich. Und bei ein BroadcastReseiver ist meines Erachtens nach ein Rückgabe oder warten auf Ergebnis nicht möglich.

Fürs bessere Verständnis ich möchte einen Bluetooth scann durchführen und dann die Geräte in die ListPreference schreiben.
Der Bluetooth-Scann und das einfügen der Optionen in die ListPreference ist kein Problem. Nur das Trigern der Bluetooth-Scanner-Classe welche in der MainActivity initialisiert ist und via OnPreferenceClickListener aufzurufen wird, ist mir jedoch nicht im klaren.

Java:
public void onCreatePreferences(Bundle bundle, String s) {

    ListPreference preference = findPreference(getString(R.string.settings_ble_choose_device_key));

    preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(@NonNull Preference preference) {

            callFunctionInMainActivity();

            return false;
        }
    });
}
Ich hoffe ihr könnt mir weiterhelfen. Ich verzweifle schon.
 

Jw456

Top Contributor
Hallo
Erstmal zur Info Preference und auch OnPreferenceClickListener ist seit API 29 Deprecate.

Der Listener wird aufgerufen wenn der User in den Einstellungen etwas auswählt anklickt sonnst nicht.

Das Problem ist in einen OnPreferenceClickListener ist das initialisieren eines Interfaces meines erachtens nach nicht möglich.

Erstellen kannst du das Interface nicht im Listener aber du kannst die Callback Methode vom Interfase in der Activity aufrufen. Und ihr das Preference mitgeben.


Und bei ein BroadcastReseiver ist meines Erachtens nach ein Rückgabe oder warten auf Ergebnis nicht möglich.

Rückgabe weniger aber warten auf einen Intent den du in der App auslöst kann er, genau dafür ist er gemacht. Und in der onReceive kannst du auch wider eine Callback aufrufen setzt natürlich auch immer voraus das du den richtigen Context mit gegeben hast.
 

wolei

Mitglied
Danke ich glaube das Hilft mir weiter.

Ich werde das mit den Broadcast receifer testen. Muss mal schauen wie ich das Implemenitert bekomme. So das es funktioniert.

Mit den BroadcastReseiver wi würdest du das machen ein Beispiel wäre Cool.


Also bei der ListPreference habe ich das mit Deprecate nicht nur bei switch Pref. Ich verwende API32. (Lt. Arduino Studio)
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Dann erkläre mal was fu willst. Wozu das mit den Listprefs?

Was willst du benutzen klassisch bt oder ble.


 
Zuletzt bearbeitet:

Robert Zenz

Top Contributor
Wenn ich mich richtig erinnere kannst du einfach einen "App internen" Broadcast machen welcher in der MainActivity gefangen wird. Beziehungsweise ich glaube es gibt die Moeglichkeit direkt die `Activity`s einer App per Broadcast aufzurufen. Ich hab aber leider noch nicht so viel damit gemacht.
 

wolei

Mitglied
Prinzipiell möchte ich dies (Siehe Bild) erreichen. Wobei die schwarzen Felder nur als Ergänzung dienen, und bereits fertig implementiert sind und funktionieren. Ich habe dies zuvor mit einem ListAdapter in einem noremalen Fragment implementiert und getestet, alles hat functioniert. Dies ist aber in einer ListPreference so nicht möglich, da die daten befor die onClick-Metode abgeschlossen ist geschrieben werden müssen. Nun mein Problem ist, ich kann zwar die Funktion über einen BroadcastReceiver triggern und eine Broadcast zurücksenden, jedoch nicht auf sie warten in dem onClicklistener. Dies habe ich beim BroadcasReseiver nicht verstanden. Womöglich ist dies auch nicht der optimale Weg. Ich versuche nur genau für dieses Problem eine Lösung zu finden. Staisch metodenaufruf ist aus verschiedensten Gründen nicht möglich.
 

Anhänge

  • Bild4.jpg
    Bild4.jpg
    53,4 KB · Aufrufe: 4

Jw456

Top Contributor
Warum muss es eine ListPreference sein?

Du kannst es doch auch in einer ListView oder besser RecyclerView anzeigen.



Für Austausch von Daten zwischen Fragmenten und Activity würde ich das ViewModel benutzen.
Hallte deine Scann Liste doch in dem ViewModel am besten in einer MutableLiveData Variablen.
Dann kannst du auch einen Observer in dem Fragment darauf setzen.


Schaue dir doch mal MVVM Patern von Android an.

Einen BroadcasReseiverwürde ich hier nicht benutzen. Wenn du auf daten von einer App wartest auf die du keinen direkten Zugriff hast ja sonst würde ich das ViewModel bevorzugen.
 

wolei

Mitglied
Schaue mal hier wie du eine Dynamic ListPreference machen kannst.
Das was du meinst mache ich ja. Sonst könnte ich den wert nicht endern. Jedoch kann man die Werte nur so lange ändern bis sie angezeigt werden.
Das heißt die letzte möglichkeit der änderung ist beim onClickListener.
Du kannst es doch auch in einer ListView oder besser RecyclerView anzeigen.
Ja könnte ich. Ist aber nicht meine Frage? Deswegen auch schwartz.

Schaue dir doch mal MVVM Patern von Android an.
Ich mache dies in der ganzen App. Jedoch ist dies in diesem Fall nicht möglich. Ausgenommen du kennst einen Weg, wie dies beim click ouf eine listpreference geht.

Meine Frage welche möglichkeiten giebt es welche einen Funktionsaufruf in einer anderen instanz ermöglichen.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Das was du meinst mache ich ja. Sonst könnte ich den wert nicht endern. Jedoch kann man die Werte nur so lange ändern bis sie angezeigt werden.
Das heißt die letzte möglichkeit der änderung ist beim onClickListener.
Für ein Updaten der Daten wärend der Anzeige dafür ist die ListPreference auch nicht gemacht gedacht.
Da ist eine Listview oder RecyclerView besser, die kannst du neu zeichnen lassen Updaten wenn sich im Hindergrund die Daten ändern.


Meine Frage welche möglichkeiten giebt es welche einen Funktionsaufruf in einer anderen instanz ermöglichen.
Dann zeige mal genau was du willst.
 

Neue Themen


Oben