Egy Android-alkalmazás építése során az első és egyik legfontosabb lépés a tevékenységek (activity) deklarálása és kezelése. Az Android Studio elindítása után az új projekt létrehozása során választhatjuk a „Blank Activity” opciót, amely automatikusan létrehozza a szükséges fájlokat – köztük a MainActivity.java és AndroidManifest.xml fájlokat. A manifest fájlban található <activity> elem deklarálja a tevékenységet, és ezzel hivatalosan is beilleszti azt az alkalmazásba. Az android:name attribútum jelöli az osztály nevét, míg az android:label attribútum adja meg a felhasználói felületen megjelenő címet.

Ha egy tevékenység nincs deklarálva a manifestben, akkor az nem válik az alkalmazás részévé, és ha mégis megpróbáljuk futtatni, futásidejű kivételt kapunk. A deklaráció tehát nem csupán formai követelmény, hanem az Android rendszer számára is ez jelzi, hogy a komponens létezik és használható.

A tevékenységek nem elszigetelt egységek – az Android-ökoszisztéma egyik legerősebb koncepciója az intent objektum. Ez egyfajta üzenet, amelyet egyik komponens küld a másiknak, és amely lehet explicit vagy implicit. Egy explicit intent pontosan megmondja, melyik tevékenységet kell elindítani, míg egy implicit intent csak a szándékot közli, és az operációs rendszer dönti el, melyik komponens képes azt kezelni.

Egy alapvető példa erre az, amikor egy gombnyomás eseményhez kapcsolt függvényben létrehozunk egy intentet, amely megnyit egy weboldalt a felhasználó alapértelmezett böngészőjében. Az Intent.ACTION_VIEW konstanst használjuk, és a setData() metódusban megadjuk a kívánt URL-t. A startActivity(intent) hívás ezután átadja az intentet az Android rendszernek, amely a megfelelő alkalmazás segítségével végrehajtja a műveletet.

Amikor egy új projektet hozunk létre, Android Studio automatikusan hozzáadja az alapértelmezett importokat, de ha manuálisan írunk kódot, szükség lehet az android.view.View és az android.content.Intent csomagok importálására is. Szerencsére az IDE segít ebben – a pirosan jelölt osztályokra állva és az Alt + Enter billentyűparanccsal automatikusan importálhatjuk őket.

A tevékenységek közötti váltás szintén az intenteken keresztül történik. Ilyenkor több tevékenységet kell létrehozni és deklarálni a manifest fájlban. Egy gombnyomás hatására egy új tevékenység indítása ugyanúgy történik, mint az előző példában, de ezúttal egy saját osztályunkra hivatkozunk az intent objektumban.

A manifest fájlban minden tevékenységet külön <activity> elemben kell deklarálni, és ha valamelyik tevékenységet szeretnénk, hogy az alkalmazás indításakor automatikusan elinduljon, annak meg kell adni az intent-filter blokkot, benne az MAIN és LAUNCHER akciókkal.

Az intent objektumok rugalmas rendszert kínálnak, ahol az alkalmazás komponensei nemcsak egymással, de más alkalmazások komponenseivel is képesek kommunikálni. Ez lehetővé teszi, hogy ne saját megoldásokat fejlesszünk minden funkcióhoz (például kamera, üzenetküldés, böngészés), hanem kihasználjuk a már telepített alkalmazások képességeit. Így az alkalmazásunk egyszerűbbé és hatékonyabbá válik, miközben a felhasználó továbbra is a számára megszokott élményben részesül.

Fontos, hogy a valós eszközön történő teszteléshez engedélyezni kell a fejlesztői módot, amelyet a „Build Number” többszöri megérintésével aktiválhatunk. A különböző gyártókhoz külön illesztőprogramok szükségesek lehetnek, amelyeket a gyártó hivatalos oldaláról lehet letölteni.

Az intentek működésének mélyebb megértéséhez érdemes tisztában lenni a különböző típusú akciókkal és adatformátumokkal, amelyeket az intent képes kezelni. Az ACTION_VIEW, ACTION_SEND, ACTION_EDIT és más konstansok különböző célokra használhatók, a setData() metódussal pedig URI formájában adhatunk át adatokat, amelyek típusuktól függően más-más alkalmazásokat indíthatnak el.

Az Android-alkalmazás tehát nem zárt rendszer. Az intent mechanizmus lehetővé teszi, hogy alkalmazásunk szervesen illeszkedjen az Android-ökoszisztémába, együttműködve más alkalmazásokkal, anélkül hogy feleslegesen újra kellene alkotni már létező és optimalizált funkcionalitásokat.

Hogyan törölhetünk kéréseket manuálisan a Volley segítségével Android alkalmazásokban?

A Volley könyvtár használata rendkívül egyszerűvé teszi az internetes kérések kezelését Android alkalmazásokban. Azonban nem minden esetben kívánatos, hogy a kérések a háttérben futjanak, amikor a felhasználó elhagyja a képernyőt, vagy a hálózati kapcsolatok nem kívánt állapotba kerülnek. Ebben az esetben szükség van arra, hogy manuálisan töröljük a kéréseket. Az alábbiakban bemutatom, hogyan érhetjük el ezt egyszerű lépésekkel.

A kérések törlésére a RequestQueue osztályban található cancelAll() metódust használhatjuk. Ehhez először be kell állítani a megfelelő tag-eket, amelyek alapján a rendszer képes lesz törölni azokat a kéréseket, amelyek már nem szükségesek. Az alábbi lépéseket követve könnyedén implementálhatjuk ezt a funkciót Android Studio projektünkben.

Készülődés

Ha még nem tettük meg, először hozzá kell adnunk a Volley modult a projektünkhöz. Ehhez kövessük az előző receptet, amely bemutatja, hogyan integrálhatjuk a Volley könyvtárat egy új Android alkalmazásba. Ezután hozzunk létre egy új projektet az Android Studio-ban, és nevezük el például CancelVolleyRequest névre.

Lépések

  1. activity_main.xml fájlban cseréljük le az aktuális TextView elemet a következő XML kóddal, amely képes megjeleníteni a hálózati válaszokat.

  2. MainActivity.java fájlban hozzunk létre egy globális változót a RequestQueue számára:

    java
    RequestQueue mRequestQueue;
  3. Az onCreate() metódusban inicializáljuk a RequestQueue-t:

    java
    mRequestQueue = Volley.newRequestQueue(this);
  4. Adjunk hozzá egy sendRequest() metódust, amely elindítja a kéréseket:

    java
    public void sendRequest(View view) {
    final TextView textView = findViewById(R.id.textView);
    String url = "https://www.packtpub.com/";
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override
    public void onResponse(String response) {
    textView.setText(response.substring(
    0, 500)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { textView.setText("onErrorResponse(): " + error.getMessage()); } }); stringRequest.setTag(this); mRequestQueue.add(stringRequest); finish(); }
  5. Adjunk hozzá egy close() metódust, hogy leállíthassuk a tevékenységet:

    java
    public void close(View view) {
    finish(); }
  6. Implementáljunk egy onStop() metódust, hogy töröljük a kéréseket, amikor az Activity leáll:

    java
    @Override protected void onStop() { super.onStop(); mRequestQueue.cancelAll(this); }
  7. Végül futtassuk az alkalmazást egy eszközön vagy emulátoron.

Hogyan működik?

A kérések törléséhez a cancelAll() metódust használjuk, amely a paraméterként megadott tag-hez tartozó összes kérést törli. Ebben a példában az Activity példányát adtuk meg tag-ként, de bármit használhatunk, ami megfelelő a csoportosítás szempontjából. A finish() metódus segítségével lezárjuk az Activity-t, így biztosítva, hogy a hálózati kérések ne folytatódjanak a háttérben.

Ez a megoldás nemcsak a kérések törlését biztosítja, hanem egy fontos programozási stratégiát is alkalmaz, az úgynevezett védelmi programozást. Azáltal, hogy biztosítjuk a kérések törlését, elkerüljük a null aktivitás problémát, mivel a Volley garantálja, hogy a törölt kérések nem küldenek vissza választ. Így az alkalmazásunk sokkal stabilabbá válik, és nem kell további kódot írni a null aktivitás kezelése érdekében.

További fontos tudnivalók

A kérések törlése nem csupán biztonságos programozási technika, hanem a felhasználói élmény szempontjából is elengedhetetlen. Ha nem töröljük időben a háttérben futó kéréseket, az alkalmazásunk nemcsak lassúvá válhat, hanem hibás működéshez is vezethet, mivel a felhasználó már nem kíváncsi azokra az adatokra, amelyek továbbra is kérés alatt állnak. A törlés segít optimalizálni a hálózati forgalmat és csökkenti a memóriahasználatot is.

Továbbá fontos megemlíteni, hogy bár a Volley gyors és könnyen használható könyvtár, bizonyos helyzetekben más megoldások, mint például az Retrofit vagy a OkHttp, jobb választásnak bizonyulhatnak, ha komplexebb hálózati műveletekről van szó. Azonban a Volley rendkívül praktikus a kisebb alkalmazások számára, ahol a gyors fejlesztés és a stabilitás a legfontosabb szempontok.

A fejlesztők számára mindig fontos, hogy figyelemmel kísérjék az alkalmazásuk teljesítményét, különösen akkor, amikor internetes kéréseket végeznek. A Volley lehetőséget biztosít arra, hogy a kéréseket könnyedén kezeljük, töröljük és csoportosítsuk, ezzel biztosítva a tiszta és hatékony alkalmazás-fejlesztési folyamatot.