Nachrichten von Activity zu Activity zur Laufzeit übermitteln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Nachrichten von Activity zu Activity zur Laufzeit übermitteln

    Hallo,
    ich bin zwar kein Anfänger was das Programmieren angeht. Aber bei JAVA für Android fühle ich mich so ahnungslos wie vor 25 Jahren als ich die ersten Assembler Codes aus meinem C64 geschrieben habe.
    Noch-dazu würde ich mich gar-nicht damit beschäftigen wenn nicht der Coder der mir die App die ich haben will machen sollte. Nicht so unzuverlässig wäre. Zumal er es sogar bezahlt bekommen hat.
    Nun denn, dies zu meiner Situation. Ich werde hier sicher noch weitere Fragen stellen, von der keiner weis was ich eigentlich will. Daher bitte ich um Nachsicht und Geduld.

    Ein Tread erzeugt eine Massage, diese wird über den Handler in der MainActivity empfangen und an ein TextView übergeben und angezeigt. Soweit so gut.
    Ich möchte jetzt die Massage an eine andere Activity weiter leiten, um sie dort auszuwerten und in einem TextView anzuzeigen.
    Wichtig ist mir. Das die Nachricht zur Laufzeit und nicht nur beim Aufruf der Activity übergeben wird.

    Mein erster Versuch war, einen Nachrichten Handler in der Empfangs Activity zu installieren. Aber logischer weise kommt da nichts an, da ich keinen Plan habe
    wie ich die Nachricht versenden soll damit diese auch ankommt.

    HilfeHilfe ... deutsche Bücher gibts zu wenige und mein Englisch ist extrem bescheiden.

    Gruss Temucin alias TFT
  • Hi, erstmal Willkommen im Forum.

    Ein Tread erzeugt eine Massage, diese wird über den Handler in der MainActivity empfangen und an ein TextView übergeben und angezeigt

    Das ist eigentlich keine Nachricht im Sinne wie es zb. in Windows ist. Vielmehr wird aus dem Thread mit Hilfe des Handlers eine Methode des UI Thread aufgerufen. Es wird der UI Thread der aufrufenden Activity aufgerufen.

    Es läuft immer nur eine Activity.
    Wenn du Events (Daten) an eine andere Klasse weiter leiten(Übergeben) möchtest würde ich das über ein Interface und einer Callbackmethode machen.

    Events werden immer an einen Listner Übergeben der zuvor initialisiert werden muss.
    Wenn du nun in Activity A den Thread startest denn vielleicht auch einen Listner mitgegeben hast und nun die Activity wegstellst laufen natürlich alle Ergebnisse ins lehre. Denn beim Aufruf von Activity B wird A zerstört. Schaue dir den LifeCycle von Activitys mal an.

    Auserdem würden uns hier ein paar Zeilen Code bestimmt weiter helfen um dir weiter zu helfen.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von jogimuc ()

  • Also Code ist kein Geheimnis ... hier die MainActivity.

    An Zeile 118 möchte ich den String readMassage an eine andere Activity weiterreichen und zwar zur Laufzeit.

    äääää den Code kann ich scheinbar nur als File anhängen ...... zu lang.....

    Das die Activity stirb wenn eine andere offen ist. Kann so nicht stimmen. Da auch wenn die andere Activity offen ist. Der Tread und der Massage Handler weiterhin Ihren Dienst verrichten. Die Nachrichten kommen von der Methode ab Zeile 218. Fon dem Tread der dort aufgerufen wird und solange läuft biss der Socket geschlossen wird.
    Dateien
    • MainActivity.zip

      (4,3 kB, 4 mal heruntergeladen, zuletzt: )
  • Ja der Thread läuft weiter und er ruft auch den Handler auf das ist eine Callbackmethode in der Activity die im UI läuft.
    Activity und Thread sind zwei verschiedene Sachen.
    Du willst also den String der in der Variablen „readMessage“ an eine andere Activity übergeben.
    Du Könntest in deiner Activity B eine static Variable oder auch eine Methode erstellen und diese im Handler der A setzen.

    Quellcode

    1. public class Test extends AppCompatActivity {
    2. static String readMessage;
    3. }


    Quellcode

    1. mHandler = new Handler(){
    2. public void handleMessage(android.os.Message msg){
    3. if(msg.what == MESSAGE_READ){
    4. String readMessage = null;
    5. try {
    6. readMessage = new String((byte[]) msg.obj, "UTF-8");
    7. } catch (UnsupportedEncodingException e) {
    8. e.printStackTrace();
    9. }
    10. mReadBuffer.setText(readMessage);
    11. Test.readMessage= readMessage;
    12. }
    13. if(msg.what == CONNECTING_STATUS){
    14. if(msg.arg1 == 1)
    15. mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj));
    16. else
    17. mBluetoothStatus.setText("Connection Failed");
    18. }
    19. }
    20. };
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Eine static Variable oder Methode braucht keine Instanz ist also von Anfang an vorhanden wird beim Kompilieren erstellt.
    Kann im selben Paket einfach so benutz werden.
    Must aber den Klassen Namen mit angeben. „Klassenname.Variable“
    In der Klasse wo die variable erstellt wird brauchst du den Klassennamen nicht.

    ps. Quelltext kannst du hier im Forum unter den </> Icon Einfügen.
    Ein Feedback auf Tipps ist auch schön. :P
  • Das mit dem Queltext ist mir bekannt ... nur habe 10000 zeichen wohl nicht gelangt.

    Bleibt nur das Problem mit dem Polling. Ich habe mir das mit dem Massage system gedacht ... weil ich dann automatisch darauf reagieren kann. Jetzt muss ich irgendwo den String ständig auf veränderung prüfen ...... aber das ist erstmal ein weg ...

    Gruss und danke

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von TFT ()

  • So .... nichts ist schöner wie erfolg. Danke nochmal.

    ich habe jetzt in der Activity A dies hier eingefügt.

    Quellcode

    1. mReadBuffer.setText(readMessage);
    2. Toast.makeText(getApplicationContext(),readMessage,Toast.LENGTH_SHORT).show();
    3. try {
    4. ConnectActivity.setMessage(readMessage);
    5. }catch (Exception e){
    6. }


    und in der Activity B dieses.


    Quellcode

    1. public class ConnectActivity extends AppCompatActivity {
    2. static TextView mReadBuffer;
    3. @Override
    4. protected void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. setContentView(R.layout.activity_connect);
    7. // änderd den Titel in der ActionBar
    8. getSupportActionBar().setTitle(R.string.connect);
    9. mReadBuffer = (TextView) findViewById(R.id.readBuffer);
    10. }
    11. static void setMessage(String message){
    12. mReadBuffer.setText(message);
    13. }
    14. }
    Alles anzeigen
    das Try/Catch verhindert das bei nicht existierender Activity eine Exeption ausgeworfen wird.

    Gruss Temucin alias TFT
  • "das Try/Catch verhindert das bei nicht existierender Activity eine Exeption ausgeworfen wird."

    Stimmt nicht, es wird eine Exeption geworfen nur das du sie im Catch Block abfängst und somit die App nicht abstürzt.

    Ein Prüfen ob die Activity läuft ist das nicht.
    Prüfen würde ich mit „If“ ob die Activity läuft und wenn nicht überspringen und nicht warten ob eine Exeption geworfen wird.

    So aus den Kopf :
    if(this.instanceof.ConnectActivity){ }

    Oder du erstellst eine static variable in B und setzt sie in onresume und löschtst sie in onpause.

    "static TextView mReadBuffer;" brauchst nicht static zu sein.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von jogimuc ()

  • --

    "das Try/Catch verhindert das bei nicht existierender Activity eine Exeption ausgeworfen wird."

    Stimmt nicht, es wird eine Exeption geworfen nur das du sie im Catch Block abfängst und somit die App nicht abstürzt.
    --
    ??? läuft das nicht auf das selbe hinaus ??? Eine Frage auf Existenz wäre natürlich besser. Stellt sich nur die Frage wie........

    Wenn ich es nicht statisch mache funktioniert es nicht im setMessage():-(
  • Wie du das ohne Try & Catch machen kannst habe ich schon geschrieben.

    Stimmt im Endeffekt ist es das selbe nur ist das kein guter Stil eine Exeption in Kauf zu nehmen wo man Genau weiß das eine entsteht. Solle man sich gar nicht erst angewöhnen.

    Wenn es static sein muss ok.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()