Ryšys tarp veiklos ir paslaugos. Kaip organizuoti duomenų perdavimą iš paslaugos į veiklą? Sudėtingų objektų perdavimas

Sveiki.

Per UART gautus duomenis būtina perkelti į Veiklą. Tai galima padaryti sukūrus giją veikloje, kurioje būtų galima organizuoti trumpą (!isInterrupted()) kilpą ir nuskaityti duomenis iš UART buferio. Po to, iškvietus veiklos vartotojo sąsajos giją - MainActivity.this.runOnUiThread(new Runnable() ), atlikite reikiamus veiksmus su šia veikla. Bet jei iš pagrindinės veiklos iškviečiame kitas veiklas, tai organizuota gija neleidžia praeiti duomenis į naujai kuriamas Veiklas.Jei gerai suprantu, kad duomenys iš srauto būtų perkelti į bet kurią Veiklą, srautas turi būti sukurtas ne Veikloje, o Paslaugoje.

Klausimas: duomenys atkeliavo per UART, temoje (kuri sukurta Servce) reikia perkelti duomenis i Activity, kuri dabar yra aktyvi, kaip tai galima padaryti ir ar tai apskritai daroma?

1 atsakymas

Kiekvienoje veikloje sukurkite tvarkyklę. Šios veiklos metodu onResume() atliekamas bindService(). Ten vienas iš parametrų yra sąsaja ServiceConnection. Įdiekite ją bent ta pačia veikla. Įdiekite joje metodą onServiceConnected(). Šiame atgalinio skambučio metu pati paslauga yra vienas iš parametrų. Taigi vadinkite šią paslaugą savo setHandler() metodu. Perduokite ten tvarkyklę, kuri yra dabartinėje veikloje. Bet mesti gaunamus duomenis per UART į šios tvarkyklės paslaugą. Beje, Handler tradiciškai veikia pagrindinėje gijoje, todėl runOnUiThread vykdyti nereikės.

Paskutinis atnaujinimas: 2018-04-03

Intent objektas naudojamas duomenims perduoti tarp dviejų veiklų. Naudodami putExtra() metodą, galite pridėti raktą ir su juo susijusią reikšmę.

Pavyzdžiui, perkeliant iš dabartinės veiklos į SecondActivity eilutę „Hello World“ su raktu „hello“:

// sukurti ketinimą paleisti SecondActivity Intent intent = new Intent(this, SecondActivity.class); // objekto perdavimas su raktu "hello" ir reikšme "Hello World" intent. putExtra("hello", "Hello World"); // paleisti SecondActivity startActivity(intent);

Duomenims perduoti naudojamas putExtra() metodas, leidžiantis perkelti paprasčiausių tipų duomenis - String, int, float, double, long, short, byte, char, šių tipų masyvus arba serializable objektą. sąsaja kaip vertė.

Norėdami gauti pateiktus duomenis, kai įkeliama SecondActivity, galite naudoti metodą get(), kuris perduodamas objekto raktui:

Argumentų rinkinys = getIntent().getExtras(); Eilutės pavadinimas = argumentai.get("labas").toString(); // Labas pasauli

Priklausomai nuo siunčiamų duomenų tipo, gaudami objektą Bundle galime naudoti daugybę metodų. Visi jie naudoja objekto raktą kaip parametrą. Pagrindiniai iš jų yra:

    get() : bendras metodas, grąžinantis objekto tipo reikšmę. Atitinkamai, gavimo laukas, ši reikšmė turi būti konvertuota į norimą tipą

    getString() : grąžina String tipo objektą

    getInt() : grąžina int reikšmę

    getByte() : grąžina baito reikšmę

    getChar() : grąžina char tipo reikšmę

    getShort() : grąžina trumpo tipo reikšmę

    getLong() : grąžina ilgą reikšmę

    getFloat() : grąžina slankiąją reikšmę

    getDouble() : grąžina dvigubą reikšmę

    getBoolean() : grąžina loginę reikšmę

    getCharArray() : grąžina char objektų masyvą

    getIntArray() : grąžina int objektų masyvą

    getFloatArray() : grąžina plūduriuojančių objektų masyvą

    getSerializable() : grąžina Serializable sąsajos objektą

Mūsų projekte apibrėžkime dvi veiklas: „MainActivity“ ir „SecondActivity“.

„SecondActivity“ kode apibrėžkime duomenų gavimą:

Paketas com.example.eugene.serializeapp; importuoti android.support.v7.app.AppCompatActivity; importuoti android.os.Bundle; importuoti android.widget.TextView; viešoji klasė SecondActivity išplečia AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16) ); Argumentų rinkinys = getIntent().getExtras(); if(argumentai!=null)( eilutės pavadinimas = argumentai.get("vardas").toString(); String company = argumentai.getString("įmonė"); int kaina = argumentai.getInt("kaina"); textView.setText("Pavadinimas: " + pavadinimas + "\nĮmonė: " + įmonė + "\nKaina: " + kaina); ) setContentView(textView); ) )

Tokiu atveju „SecondActivity“ mes gauname visus duomenis iš „Bundle“ objekto ir rodome juos „TextView“ teksto lauke. Daroma prielaida, kad šiai veiklai bus perduoti trys elementai – dvi eilutės su raktų pavadinimu ir įmonės pavadinimu bei skaičius su kainos raktu.

Dabar apibrėžkime duomenų perdavimą į SecondActivity. Pavyzdžiui, faile activity_main.xml apibrėžkime šią MainActivity sąsają: