Nachrichten vom FirebaseMessagingService an die MainActivity übergeben?

V

Vultan

Fortgeschrittenes Mitglied
15
Ich hab vor 5 Tagen angefangen mit Android Studio.
Sicher sollte ich alles nach und nach angehen, aber ich lerne am besten beim ausprobieren.
Meine App kann inzwischen Google-Push Nachrichten empfangen, Sprechen,
Einträge in XML Dateien Lesen Speichern und Löschen.
Mit SharedPreferences die Eingabefelder Speichern
und meine Lampen über IOBroker ein und ausschalten.
Nein ich hab das nicht alles so zusammengebaut ich lerne auch erfolgreich dabei.
Zudem kann ich auch PureBASIC und andre Sprachen.
Durch meine eigne Art zu lernen, hab ich auch etwas Erklärungsnöte.
Ich hoffe das ich mich verständlich ausdrücke!

Jetzt habe ich das Problem,
das wenn die Google-Push Nachrichten in der Klasse
public class ....... FirebaseMessagingService ankommen.

kann ich zwar Variablen an public class MainActivity ..... übergeben,
aber wenn ich versuche ein Element zu ändern, mit zum Beispiel!
MainActivity.imageButtonLicht.setActivated(true);
Stürzt die App einfach ab.

Eigentlich ist meine Frage wie gebe ich die Nachrichten
vom FirebaseMessagingService an die MainActivity so weiter,
Das ich die Nachrichten direkt nach dem eintreffen bearbeiten kann ?


Hier hab ich mal das nötigste zusammengestellt.

Code:
public class FcmMessagineService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        String title = remoteMessage.getNotification().getTitle();
        String massage = remoteMessage.getNotification().getBody();
        popMessage(title,massage); 
        String neueNachricht = title +"__"+ massage;
        MainActivity.testVariableXXXXX = neueNachricht;        // OK
        MainActivity.imageButtonLicht.setActivated(true);     // absturtz
    }
}


Code:
public class MainActivity extends AppCompatActivity {
    static String testVariableXXXXX = "Main";
    static ImageButton imageButtonLicht ; 
    @SuppressLint("WrongViewCast")
    
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final SharedPreferences sharedPreferences = getPreferences(this.MODE_PRIVATE);
        
        imageButtonLicht    = (ImageButton) findViewById(R.id.imageButtonLicht);
        imageButtonLicht.setActivated(false);

        imageButtonLicht.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageButtonLicht.setActivated(true);
                }
        });
    }
}
 
Hallo,

was sagt denn dein error-Log in dem Falle ?
Ich vermute mal , dass deine Mainactivity Instanz nicht mehr gültig ist ,
oder du auf den UI Thread zugreifst.

Communicate with the UI thread | Android Developers



Bitte stelle mal den Log ein , damit wir nicht rätseln müssen.

Nachtrag :
Code:
MainActivity.imageButtonLicht.setActivated(true);

sieht sehr sehr statisch aus , das kannst du unter Android so nicht zuverlässig umsetzen .
 
Zuletzt bearbeitet:
Hallo und Danke für die schnelle Antwort
Das bekomme ich als error Meldung. Ist alles Rot!

Code:
==================
E/dalvikvm: Could not find class 'android.app.Notification$Action$Builder', referenced from method android.support.v4.app.NotificationCompatBuilder.addAction
E/dalvikvm: Could not find class 'android.media.AudioAttributes$Builder', referenced from method android.support.v4.app.NotificationCompat$Builder.setSound
.....
.....
.....
E/AndroidRuntime: FATAL EXCEPTION: Firebase-FcmMessagineService
    Process: com.example.markus.fcmwithappserver, PID: 11698
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6030)
        at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:853)
        at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
        at android.view.View.invalidate(View.java:10935)
        at android.view.View.setActivated(View.java:15754)
        at com.example.markus.fcmwithappserver.FcmMessagineService.onMessageReceived(FcmMessagineService.java:83)
        at com.google.firebase.messaging.FirebaseMessagingService.zzd(Unknown Source)
        at com.google.firebase.iid.zzc.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at com.google.android.gms.common.util.concurrent.zza.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:841)
==================
 
Und da haben wir schon den Fehler :)

Only the original thread that created a view hierarchy can touch its views.

Du greifst (verbotener Wiese) auf den UI Thread zu . (Siehe oben)

Auch wenn du erst seit 5 Tage dran bist, Dein Programsstil ist nicht Android Java conform
(Siehe auch oben)
Du kannst dazu ggf Listener einsetzen.
 
  • Danke
Reaktionen: markus.tullius
OK Danke das ist ein Ansatz! Ich schau mal.
Ja, ich weiß, das meine Programmiertechnik im Moment unter alle sa.. ist.
Aber bisher hab ich so eine menge Programmiersprachen gelernt.
Die Feinheiten mach ich später.
Das muss man nicht verstehen! Aber bei mir Funktioniert das.

Angefangen hat alles mit dem C64 und Maschinensprache!
Nein ich will keinen Weltrekord brechen!
Hat sich alles so ergeben!
 
Aber bei mir Funktioniert das.

Aber nicht lange - sorry :) Das ist gelinde gesagt sehr tödlich

Unter Android sollte man keine statischen Ausdrücke anwenden , da dir Android den Inhalt von Variablen
"klauen" kann - Lese dazu Dir mal GarbageCollector und LifeCycle durch.

Anders als unter C/C++ u.ä. musst du dich selbst darum kümmern und ggf die Instanz in der einer zweiten Klasse mit getter und setter verarbeiten .
Oder einen Constructor verwenden, der die ParentInstanz übergibt.
Alternativ dazu die Klasse als SingleTon vererben.
 
Das finde ich immer so lustig in Foren!
Mann möchte nur einen kleinen schubs!
Und muss sich für jedes Komma verantworten.
Ja ich habe Bücher , Ja ich kenne getter und sette , ua. !
Aber ich fahre halt meine eigene Schiene
Und dennoch brauche ich vor der Mühe den Erfolg! ;)
 
Zuletzt bearbeitet:
Das finde ich immer so lustig in Foren!

Mann möchte nur einen kleinen schubs!
Und muss sich für jedes Komma verantworten.
Ja ich habe Bücher , Ja ich kenne getter und sette , ua. !
Aber ich fahre halt meine eigene Schiene
Und dennoch brauche ich vor der Mühe den Erfolg!

Das kam jetzt nicht gerade höflich an .

Bitte bedenke : An der anderen Seite sitzen Programmierer , die sich für DICH
die Zeit nehmen, auf DEIN Problem einzugehen . - Wir können es bereits und üben es beruflich aus.

Wenn es Dir also nicht recht sein sollte , dass man sich diese Zeit nimmt ,
dann sei bitte uns gegenüber so fair und frage nicht mehr nach.

Und wenn du Bücher hast und es eh besser weist :
Warum setzt du das nicht so um , wie es dort beschrieben steht ? :)
 
  • Danke
Reaktionen: jogimuc
Das hat jetzt nichts mit "für ein Komma verantworten" zu tun.
Ein Service und eine Activity haben einfach einen komplett anderen Lifecycle. Dein Service kann ja auch Nachrichten empfangen wenn deine Activity gar nicht da ist, weil der User was anderes macht.
Deshalb sollte man mit etwas wie EventBus, LocalBroadcast oder rxJava beschäftigen. Das tut erstmal weh, aber anders funktioniert es einfach nicht.
 
  • Danke
Reaktionen: jogimuc und swa00
deek - hat keinen Mehrwert - scheint zwecklos zu sein :)
 
Entschuldigung ! :1f622: Ich habe was vergessen!
Mein Fehler!
Das sollte so aussehen!

Nicht falsch verstehen, ich bin auch dankbar für den Tipp!

Das finde ich immer so lustig in Foren!
.......
...


Nachtrag:
ist vielleicht auch nicht besser,
war aber auch nicht böse gemeint!
 
Zuletzt bearbeitet:

Ähnliche Themen

S
Antworten
0
Aufrufe
592
Sergio13
S
FabianDev
Antworten
5
Aufrufe
555
swa00
swa00
M
Antworten
8
Aufrufe
954
deek
D
Zurück
Oben Unten