Comunicarea între activitate și serviciu. Cum se organizează transferul de date de la Serviciu la Activitate? Transferul de obiecte complexe

Buna ziua.

Este necesar să transferați datele primite prin UART către Activitate. Acest lucru se poate face prin crearea unui fir în Activitate în care să se organizeze o buclă while (!isInterrupted()) și să se citească datele din bufferul UART. După aceea, apelând firul UI Activity - MainActivity.this.runOnUiThread(new Runnable() , efectuați acțiunile necesare cu această Activitate. Dar dacă apelăm alte Activități din Activitatea principală, atunci firul organizat nu permite transmiterea datelor către Activitățile nou create Dacă am înțeles corect, pentru ca datele dintr-un flux să fie transferate în orice Activitate, fluxul trebuie creat nu în Activitate, ci în Serviciu.

Întrebare: datele au ajuns prin UART, într-un flux (care este creat în Servce) este necesar să transferați date către Activitate, care este acum activă, cum se poate face acest lucru și se face chiar acest lucru?

1 raspuns

În fiecare activitate creați un Handler. În metoda onResume() a acestei activități, bindService() este finalizat. Unul dintre parametrii de acolo este interfața ServiceConnection. Implementați-l cu cel puțin aceeași activitate. Implementați metoda onServiceConnected() în ea. În acest apel invers, unul dintre parametri este Serviciul în sine. Deci, apelați metoda setHandler() proprie a acestui serviciu. Treceți acolo Handler-ul care se află în Activitatea curentă. Dar trimiteți datele primite prin UART către Service pe acest Handler. Apropo, Handler rulează în mod tradițional pe firul principal, deci nu va fi nevoie să rulațiOnUiThread.

Ultima actualizare: 04/03/2018

Un obiect Intent este utilizat pentru a transfera date între două activități. Prin metoda putExtra() puteți adăuga o cheie și valoarea asociată acesteia.

De exemplu, trecerea șirului „Hello World” cu cheia „hello” din activitatea curentă la SecondActivity:

// crearea unui obiect Intent pentru a lansa SecondActivity Intent intent = new Intent(this, SecondActivity.class); // trecerea unui obiect cu cheia "hello" și valoarea "Hello World" intent.putExtra("hello", "Hello World"); // începe SecondActivity startActivity(intent);

Pentru a transfera date, se folosește metoda putExtra(), care vă permite să transferați date de cele mai simple tipuri ca valoare - String, int, float, double, long, short, byte, char, arrays de aceste tipuri sau un Serializable obiect de interfață.

Pentru a obține datele trimise la încărcarea SecondActivity, puteți utiliza metoda get(), căreia i se transmite cheia obiectului:

Bundle arguments = getIntent().getExtras(); Nume șir = arguments.get("bună ziua").toString(); // Salut Lume

În funcție de tipul de date pe care le trimitem, putem folosi o serie de metode pe obiectul Bundle atunci când îl primim. Toate iau ca parametru cheia obiectului. Principalele:

    get() : o metodă generică care returnează o valoare de tip Object. În consecință, câmpul de recepție al acestei valori trebuie convertit la tipul dorit

    getString() : returnează un obiect String

    getInt() : returnează o valoare int

    getByte() : returnează o valoare de octet

    getChar() : returnează o valoare char

    getShort() : returnează o valoare de tip short

    getLong() : returnează o valoare lungă

    getFloat() : returnează o valoare flotantă

    getDouble() : returnează un dublu

    getBoolean() : returnează o valoare booleană

    getCharArray() : returnează o matrice de obiecte char

    getIntArray() : returnează o matrice de obiecte int

    getFloatArray() : returnează o matrice de obiecte float

    getSerializable() : returnează un obiect de interfață Serializable

Să avem două activități definite în proiectul nostru: MainActivity și SecondActivity.

În codul SecondActivity, vom defini primirea datelor:

Pachetul com.example.eugene.serializeapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; clasa publică SecondActivity extinde AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16, 16, 16) ); Bundle arguments = getIntent().getExtras(); if(arguments!=null)( String name = arguments.get("name").toString(); String company = arguments.getString("company"); int preț = arguments.getInt("preț"); textView.setText("Nume: " + nume + "\nCompanie: " + companie + "\nPreț: " + preț ) setContentView(textView) )

În acest caz, în SecondActivity obținem toate datele din obiectul Bundle și le afișăm în câmpul text TextView. Se presupune că la această activitate vor fi trecute trei elemente - două șiruri cu numele cheilor și firma și un număr cu prețul cheii.

Acum să definim transferul de date către SecondActivity. De exemplu, să definim următoarea interfață pentru MainActivity în fișierul activity_main.xml: