Kihagyás

Mobil- és webes szoftverfejlesztés - 2. előadás

Letöltés PDF-ként

Kotlinos tudnivalók

  • JVM byte kódra fordul a Kotlin is
  • Java és Kotlin kód keverhető (automatikus konverzió van)
  • Java API-k, keretrendszerek és könyvtárak ugyan úgy használhatóak
  • null-safety → kevesebb NullPointerException
  • szépen olvasható a kódja

Kotlin (csak címszavak szintjén)

  • val & var

  • stringek ($ jel használata)

  • null érték (Int? → null is lehet)

    • var x: List<String?> = listof(null, null, null) → egy lista, aminek String elemei lehetnek null-ok
    • var x: List<String>? = null → egy lista, ami lehet null, de elemei nem
  • null tesztelés

    • kotlin var nullTest : Int? = null nullTest?.inc() //inc csak akkor hívódik meg, ha nullTest NEM null

    • Elvis operátor:

      var x: Int? = 4
      var y = x?.toString) ?: "" //ha x értéke null, akkor y értéke egy üres string lesz
      
    • Double bang → NullPointerException kikényszerítése

      var x: Int? = null
      x!!.toString() //itt kotlin.KotlinNullPointerException lesz dobva
      
  • függvények

    • függvény szintaxis

      fun add(a: Int, b: Int): Int {
          return a + b
      }
      
    • kifejezés törzs, visszatérési típus se kell ha egyértelmű

      fun add(a: Int, b: Int) = a + b
      
    • érték nélküli visszatérés → Unit, de ez elhagyható

  • osztályok

    • ```kotlin //constructor szó elhagyható class Car constructor(val type: String) { //zárójelben primary constructor paraméterekkel val typeUpper = type.toUpperCase() //primary constructor tagváltozóira lehet hivatkozni init { //primary constructor inicializáló blokkja Log.d("TAG_DEMO", "Car created: ${type}") }

      constructor(type: String, model: String): this(type) { //secondary constructor
          Log.d("TAG_DEMO!", "Car model: ${model}")
      }
      

      } val car = Car("Toyota") //példányosítás, NEM kell new kulcsszó! ```

      • az elsődleges konstruktor paraméterei bekerülnek property-ként az osztályba (ha előttük van, hogy var vagy val)
    • leszármaztatás:

      open class Item(price: Int) { //open -> így írható felül (alapból final)
          open fun calculatePrice() {}
          fun load() {}
      }
      
      class SpecialItem(price: Int) : Item(price) { //öröklés kettősponttal
          final override fun calculatePrice() {} //final -> azaz később nem lehet már felülírni
      }
      
  • property-k

    class Car {
        var type: String? = null
            set(type) {
                Log.d("TAG_CAR", "type SET")
                field = type
            }
    }
    

Android projekt felépítése, fordítása

Felépítés

  • MainActivity.kt → kotlin forrásfájl
  • erőforrások → res mappában, R osztály ebből generálódik
    • drawable → képek
    • layout → elrendezések
    • mipmap → ikonok
    • values → pl színek, szövegek, stílusok
    • (new → Android Resources Directory → itt van sokféle erőforrás típus)
    • könyvtárak után minősítők írhatók (kötőjel után, pl values-hu)
      • mely tulajdonság esetén vegye ebből a könyvtárból az erőforrásokat
    • FONTOS: res mappába NE legyen hiba (mert a teljes R.java-t elrontja :( )
  • manifest fájl (manifests/AndroidManifes.xml) → alkalmazás metainformációit tartalmazza
    • ikonja, neve, verziója, jogosultságok
    • alkalmazás komponenseinek felsorolása, plusz ki implementálja
    • alkalmazás telepítésekor ellenőrzi a rendszer
    • LANCHER kategória → bekerült az alkalmazások közé
    • MAIN kategória → a fő activity-t jelöli

Fordítás (zh-n szeretik kérdezni)

  • végeredménye .apk
    • tömörített állomány
  • image-20200929113229408

Android alkalmazás komponensek

  • 4 komponensből építkezhetünk
    • Activity → egy képernyő (nézet, UI), android.app.Activity osztályból származik le
    • Service → kódot futtat a háttérben, magában nincs felhasználói felülete, android.app.Service osztályból származik le
    • Content Provider → alkalmazás egymás közti adatmegosztását támogatja (névjegyzék, naptár hozzáférés, akár fájlrendszerből, adatbázisból, webről), android.content.ContentProvider osztályból származik le
    • Broadcast Receiver → rendszer meg egyéb broadcast-ekre feliratkozás (pl kikapcsolt a képernyő, hívás jött be, elkészült egy fotó, stb), alkalmazás is indíthat saját broadcast-et, nincs saját felületük, android.content.BroadcastReceiver osztályból származik le
  • komponensek külön belépési ponttal rendelkeznek
    • ikonra nyomva, vagy broadcast-en keresztül is pl megindulhat
    • több main activity is lehet → 2 ikon lesz, 2 belépési ponttal

Activity életciklus

  • tipikusan egy képernyő (UI), ablak
  • egy alkalmazás = több lazán csatolt activity (de létezik egy fő activity, ahonnan indul)

Életciklus részei

image-20200929113328504

  • Életciklus:
    • Activity elindul → onCreate()
    • Láthatóvá válik → onStrart()pl BroadcastReceiver-re feliratkozás
    • Fókuszt kap (kattinthatóvá válnak rajta a dolgok) → onResume()pl játék zene itt indítható
    • Másik activity kerül előtérbe → onPause() → pl zene itt állítandó le
    • Activity egyáltalán nem látszik → onStop()
    • Teljesen bezáródik → onDestroy()minden maradék erőforrás felszabadítása
    • A felhasználó az activity-re navikgál → onRestart() → Stop-ból Start-ba kerül
  • Paused vagy Stopped állapotban bármikor leállíthatja a rendszer az activity-t memória-felszabadítás céljából
  • mindegyik metódus felüldefiniálásakor meg kell hívni az őst (super.onCreate())
  • FONTOS: A képernyő elforgatásával az adott activity megszűnik, majd egy új activity indul
    • azaz ha var score = 10 értékben akarjuk a rekordot tárolni, egy képernyő elforgatáskor elveszik az

Activity-ből másik activity indítása

  • kotlin fun runSecondActivity() { val myIntent: Intent = Intent() myIntent.setClass(this@MainActivity, SecondActivity::class.java) //adat átadása myIntent.putEctra("KEY_DATA", "Hi there!") startActivity(myIntent) }