Mobil- és webes szoftverfejlesztés - 2. előadás¶
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-okvar 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

Android alkalmazás komponensek¶
- 4 komponensből építkezhetünk
- Activity → egy képernyő (nézet, UI),
android.app.Activityosztályból származik le - Service → kódot futtat a háttérben, magában nincs felhasználói felülete,
android.app.Serviceosztá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.ContentProviderosztá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.BroadcastReceiverosztályból származik le
- Activity → egy képernyő (nézet, UI),
- 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¶

- É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
- Activity elindul →
PausedvagyStoppedá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
- azaz ha
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) }