Әрекет пен қызмет арасындағы байланыс. Қызметтен әрекетке деректерді беруді қалай ұйымдастыруға болады? Күрделі объектілерді тасымалдау

Сәлеметсіз бе.

UART арқылы алынған деректерді Әрекетке жіберу қажет. Бұл әрекетте уақытша циклды (!isInterrupted()) ұйымдастыратын және UART буферінен деректерді оқитын ағын жасау арқылы жасауға болады. Осыдан кейін, UI ағынын шақыру арқылы Activity - MainActivity.this.runOnUiThread(new Runnable() , осы әрекетпен қажетті әрекеттерді орындаңыз. Бірақ егер біз негізгі әрекеттен басқа Әрекеттерді шақырсақ, онда ұйымдастырылған ағын деректерді жіберуге рұқсат бермейді. жаңадан жасалған әрекеттерді дұрыс түсінсем, ағындағы деректер кез келген әрекетке тасымалдануы үшін ағын әрекетте емес, қызметте жасалуы керек.

Сұрақ: деректер UART арқылы келді, ағында (ол Сервседе жасалған) қазір белсенді әрекетке деректерді тасымалдау керек, мұны қалай жасауға болады және бұл орындалды ма?

1 жауап

Әрбір әрекетте өңдеуші жасайсыз. Осы әрекеттің onResume() әдісінде bindService() орындалады. Параметрлердің бірі ServiceConnection интерфейсі болып табылады. Оны кем дегенде бірдей әрекетпен жүзеге асырыңыз. Ондағы onServiceConnected() әдісін енгізіңіз. Бұл кері қоңырауда параметрлердің бірі Қызметтің өзі болып табылады. Сондықтан осы Қызметтің жеке setHandler() әдісін шақырыңыз. Ағымдағы әрекеттегі өңдеушіге өтіңіз. Бірақ кіріс деректерді UART арқылы осы өңдегіштегі Қызметке жіберіңіз. Айтпақшы, Handler дәстүрлі түрде негізгі ағында жұмыс істейді, сондықтан runOnUiThread қажет болмайды.

Соңғы жаңарту: 04.03.2018

Intent нысаны екі әрекет арасында деректерді тасымалдау үшін пайдаланылады. Оның putExtra() әдісі арқылы кілтті және онымен байланысты мәнді қосуға болады.

Мысалы, «Hello World» жолын «сәлем» пернесі ағымдағы әрекеттен SecondActivity-ке беру:

// SecondActivity іске қосу үшін Intent нысанын жасау Intent intent = new Intent(бұл, SecondActivity.class); // «сәлем» пернесі және «Hello World» мәні бар нысанды беру intent.putExtra("сәлем", "Hello World"); // іске қосу SecondActivity startActivity(inent);

Деректерді тасымалдау үшін ең қарапайым типтегі деректерді мән ретінде тасымалдауға мүмкіндік беретін putExtra() әдісі пайдаланылады - String, int, float, double, long, short, байт, char, осы типтегі массивтер немесе Serializable. интерфейс объектісі.

SecondActivity жүктелген кезде жіберілген деректерді алу үшін сіз нысан кілті арқылы берілетін get() әдісін пайдалана аласыз:

Бума аргументтері = getIntent().getExtras(); Жол атауы = arguments.get("сәлем").toString(); // Сәлем Әлем

Біз жіберіп жатқан деректер түріне байланысты біз оны алған кезде Bundle нысанында бірқатар әдістерді пайдалана аламыз. Олардың барлығы объект кілтін параметр ретінде қабылдайды. Негізгілері:

    get() : Object түрінің мәнін қайтаратын жалпы әдіс. Сәйкесінше, қабылдау өрісі бұл мәнді қажетті түрге түрлендіруі керек

    getString(): String нысанын қайтарады

    getInt(): int мәнін қайтарады

    getByte(): байт мәнін қайтарады

    getChar(): таңба мәнін қайтарады

    getShort() : short түріндегі мәнді қайтарады

    getLong() : ұзын мәнді қайтарады

    getFloat(): қалқымалы мәнді қайтарады

    getDouble(): қос мәнді қайтарады

    getBoolean(): логикалық мәнді қайтарады

    getCharArray(): char нысандарының массивін қайтарады

    getIntArray() : int нысандарының массивін қайтарады

    getFloatArray() : қалқымалы нысандардың массивін қайтарады

    getSerializable() : Серияланатын интерфейс нысанын қайтарады

Біздің жобада анықталған екі әрекетті алайық: MainActivity және SecondActivity.

SecondActivity кодында біз деректерді қабылдауды анықтаймыз:

com.example.eugene.serializeapp бумасы; android.support.v7.app.AppCompatActivity импорттау; android.os.Bundle импорттау; android.widget.TextView импорттау; жалпы класс SecondActivity AppCompatActivity кеңейтеді ( @Override қорғалған void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); TextView textView = new TextView(бұл); textView.setTextSize(20); textView.setPadding(16, 16, 16, 16) ); Bundle аргументтері = getIntent().getExtras(); if(arguments!=null)( String name = arguments.get("name").toString(); String company = arguments.getString("компания"); int price = arguments.getInt("price"); textView.setText("Атауы: " + атауы + "\nКомпания: " + компания + "\nБағасы: " + бағасы ) setContentView(textView) )

Бұл жағдайда SecondActivity бағдарламасында біз Bundle нысанынан барлық деректерді аламыз және оны TextView мәтіндік өрісінде көрсетеміз. Бұл әрекетке үш элемент беріледі деп болжануда - кілттердің аты мен компаниясы бар екі жол және кілт бағасы бар сан.

Енді деректерді SecondActivity-ге тасымалдауды анықтайық. Мысалы, activity_main.xml файлында MainActivity үшін келесі интерфейсті анықтайық: