Komunikacija između aktivnosti i usluge. Kako organizirati prijenos podataka od usluge do aktivnosti? Prijenos složenih objekata

Zdravo.

Potrebno je podatke primljene putem UART-a prenijeti u Aktivnost. To se može učiniti stvaranjem niti u Aktivnosti u kojoj se organizira while petlja (!isInterrupted()) i čitaju podaci iz UART međuspremnika. Nakon toga, pozivanjem UI niti Activity - MainActivity.this.runOnUiThread(new Runnable() , izvršite potrebne radnje s ovom aktivnošću. Ali ako pozovemo druge aktivnosti iz glavne aktivnosti, tada organizirana nit ne dopušta prosljeđivanje podataka u novostvorene aktivnosti Ako sam dobro razumio, da bi se podaci iz toka mogli prenijeti u bilo koju aktivnost, tok mora biti kreiran ne u aktivnosti, već u usluzi.

Pitanje: podaci su stigli preko UART-a, u streamu (koji se kreira u Servce-u) potrebno je prebaciti podatke u Activity, koja je sada aktivna, kako to učiniti i da li se to uopće radi?

1 odgovor

U svakoj aktivnosti kreirate rukovatelja. U metodi onResume() ove aktivnosti, bindService() je gotov. Jedan od parametara je sučelje ServiceConnection. Provedite ga s barem istom aktivnošću. U njemu implementirajte metodu onServiceConnected(). U ovom povratnom pozivu, jedan od parametara je sama usluga. Dakle, pozovite vlastitu metodu setHandler() ove usluge. Proslijedite tamo rukovatelja koji je u trenutnoj aktivnosti. Ali šaljite dolazne podatke putem UART-a u uslugu na ovom rukovatelju. Usput, Handler tradicionalno radi na glavnoj niti, tako da neće biti potrebe za pokretanjem OnUiThread.

Zadnja izmjena: 03.04.2018

Objekt Intent koristi se za prijenos podataka između dvije aktivnosti. Putem metode putExtra() možete dodati ključ i njegovu pridruženu vrijednost.

Na primjer, prosljeđivanje niza "Hello World" s ključem "hello" iz trenutne aktivnosti u SecondActivity:

// kreiranje Intent objekta za pokretanje SecondActivity Intent intent = new Intent(this, SecondActivity.class); // prosljeđivanje objekta s ključem "hello" i vrijednošću "Hello World" intent.putExtra("hello", "Hello World"); // pokretanje SecondActivity startActivity(namjera);

Za prijenos podataka koristi se metoda putExtra() koja vam omogućuje prijenos podataka najjednostavnijih tipova kao vrijednosti - String, int, float, double, long, short, byte, char, polja ovih tipova ili Serializable objekt sučelja.

Da biste dobili poslane podatke prilikom učitavanja SecondActivity, možete koristiti metodu get(), kojoj se prosljeđuje ključ objekta:

Argumenti paketa = getIntent().getExtras(); Naziv niza = arguments.get("hello").toString(); // Pozdrav svijete

Ovisno o vrsti podataka koje šaljemo, možemo koristiti brojne metode na objektu Bundle kada ga primimo. Svi oni uzimaju ključ objekta kao parametar. Glavni:

    get() : generička metoda koja vraća vrijednost tipa Object. Sukladno tome, primajuće polje mora pretvoriti ovu vrijednost u traženi tip

    getString() : vraća String objekt

    getInt() : vraća int vrijednost

    getByte() : vraća vrijednost bajta

    getChar() : vraća char vrijednost

    getShort() : vraća vrijednost tipa short

    getLong() : vraća dugu vrijednost

    getFloat() : vraća vrijednost float

    getDouble() : vraća duplo

    getBoolean() : vraća Booleovu vrijednost

    getCharArray() : vraća niz char objekata

    getIntArray() : vraća niz int objekata

    getFloatArray() : vraća niz float objekata

    getSerializable() : vraća objekt sučelja koji se može serijalizirati

Neka nam u projektu budu definirane dvije aktivnosti: MainActivity i SecondActivity.

U kodu SecondActivity definirat ćemo primanje podataka:

Paket com.example.eugene.serializeapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; javna klasa SecondActivity proširuje AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16 ); Bundle arguments = getIntent().getExtras(); if(arguments!=null)( String name = arguments.get("name").toString(); String company = arguments.getString("company"); int cijena = arguments.getInt("cijena"); textView.setText("Naziv: " + naziv + "\nTvrtka: " + tvrtka + "\nCijena: " + cijena ) setContentView(textView) )

U ovom slučaju, u SecondActivity dobivamo sve podatke iz Bundle objekta i prikazujemo ih u tekstualnom polju TextView. Pretpostavlja se da će ovoj aktivnosti biti proslijeđena tri elementa - dva niza s ključevima ime i tvrtka i broj s ključem cijene.

Sada definirajmo prijenos podataka u SecondActivity. Na primjer, definirajmo sljedeće sučelje za MainActivity u datoteci activity_main.xml: