Programování pro Android- úvod
Tomáš Kypta@TomasKypta
Obsah1. OS Android
2. Android ekosystém
3. Specifika platformy
4. Android SDK a vývojové nástroje
5. Základní stavební kameny aplikací, manifest
6. Hello World
7. Aktivity, intenty, UI
8. Menu, toast, dialog, notifikace
OS Android
založen na Linuxu
open-source - http://source.android.com/
telefony, tablety, Google TV
stovky různých zařízení
Historie
2003 založeno Android inc.
2005 koupeni Googlem
2008 první Android telefon - T-Mobile G1
nyní přes 700 mil. aktivovaných zařízení
Verze Androidu
září 2008 Android 1.0
prosinec 2010 Android 2.3 Gingerbread
únor 2011 Android 3.0 Honeycomb
říjen 2011 Android 4.0 Ice Cream Sandwich
červen 2012 Android 4.1 JellyBean
aktuálně poslední verze Android 4.2.2
Aktuální podíl verzí Androidu
Android ekosystém
světově nejpopulárnější platforma
Google Play - http://play.google.com
> 800 000 aplikací
Google Play
25 mld nainstalovaných aplikací (září 2012)
~ 70% aplikací zdarma
obsahuje také hudbu a knihy (v ČR a SR zatím nedostupné)
Publikace v Google Play
registrační poplatek $25
vracení aplikací do 15 minut
monetizace - placené aplikace, in-app billing, reklamy
Problémy Androidu
fragmentace
“vylepšení” výrobců a operátorů
podpora a aktualizace
otevřenost Google Play
malware - uživatelé
Systémová oprávnění
uživatelé akceptují při instalaci
aplikace lze nainstalovat i přímo z balíčku (.apk)
Vývojprogramuje se v jazyce “Java”
lze vytvářet také nativní aplikace
vývojové nástroje pro všechny platformy
Windows, Mac OS X, Linux
podpora vývojových prostředí
oficiální ADT plugin pro Eclipse
IntelliJ IDEA (Community Edition)
plugin pro Netbeans
vývoj na zařízeních není omezen
Android SDKandroid - Android SDK and AVD Manager
adb - Android Debug Bridge
ddms - Dalvik Debug Monitor
emulator
aapt, jarsigner, zipalign
logcat, lint, hierarchyviewer, traceview, systrace
ProGuard
Android SDKdokumentace
ukázkové aplikace
knihovny
compatibility libraries - support-v4
AdMob
Google Analytics
billing, licensing
Další knihovny
ActionBarSherlock - http://actionbarsherlock.com/
NineOldAndroids - http://nineoldandroids.com/
SlidingMenu - https://github.com/jfeinstein10/SlidingMenu
Flurry Analytics, Crittercism
Základy vývojeaplikace jsou složeny komponent
aktivity
služby
content providery
broadcast receivery
AndroidManifest.xml definuje komponenty aplikace
resourcy
Activityobrazovka aplikace obsahujicí UI prvky
jediná vizuální komponenta
příklady
seznam emailů
detail emailu
psaní emailu
nastavení aplikace
Servicenemá UI
dlouhotrvající tasky
lze startovat jednorázově nebo se připojovat k dlouhoběžící službě
příklady
služba pro přehrávání hudby
služba pro stahování dat
Content Provider
poskuje přístup k datům
uložiště dat může být jakékoliv - databáze, web, soubory na disku
skrz content provider lze data získávat i měnit
příklady
všechny systémové databáze - kontakty, SMS
Broadcast Receiverreaguje na broadcast
broadcasty jsou posílání napříč systémem
lze registrovat staticky i dynamicky (nemusí být v manifestu)
systémové i vlastní broadcasty
broadcasty lze i vysílat
příklady
příchozí SMS, volání
odpojení SD karty
vypnutí obrazovky
AndroidManifest.xml
komponenty aplikace
definuje přístupové body aplikace
rozsah kompatibilních verzí systému
oprávnění - vyžadovaná i definovaná
vyžadované hardware a software vlastnosti
vyžadovanou konfiguraci
Intent
asynchronní zpráva
propojuje komponenty (vyjma Content Providerů)
startuje aktivity
startuje servicy a vyváří spojení
zasílání broadcastů
Sestavení
Build
Build
Aktivity podrobněji
podtřída android.app.Activity
aplikace mají typicky spoustu aktivit
aktivity jsou interně drženy v zásobníku aktivit
lze se vracet k předchozím obrazovkám
Životní cyklus aktivitaktivity se vyskytují v různých stavech během svého života
na popředí
viditelné
zastavené
zabité
systém volá callbacky při přechodu mezi aktivitami
Životní cyklus aktivit
Intenty a aktivityvytváření aktivit explicitně
vytváření aktivit implicitně
vytváření aktivit pro výsledek
Intent intent = new Intent(MainActivity.this, OtherActivity.class);startActivity(intent);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(video.getUrl()));startActivity(intent);
Intent intent = new Intent(MainActivity.this, OtherActivity.class);startActivityForResult(intent, REQUEST_USER);
Změny konfigurace
při změně konfigurace jsou aktivity zabity a znovu vytvořeny
změny konfigurace - rotace, otevření hw klávesnice
nutné správně ošetřit
uložit stav v onSaveInstanceState()
načíst stav v onCreate() nebo onRestoreInstanceState()
Uživatelské rozhranídefinováno hierarchií views
jednoduchá views (widgety)
Button, TextView, EditText, ProgressBar, ...
WebView, MapView
layouty - kontejnery
LinearLayout, RelativeLayout, FrameLayout
seznamy - využívají adaptery
ListView, GridView, Spinner, Gallery
UI - seznamy
zobrazují seznam prvků
prvků může být obrovské množství
recyklace views
využívají adaptery - most mezi daty a views
Aplikační resourcyobrázky (drawables)
layouty
lokalizační řetězce
barvy
menu
rozměry
animace
binární (raw)
pole, identifikátory, ...
Optimalizace vzhledu
nutné řešit různá rozlišení
ldpi - 0.75x
mdpi - 1.0x
hdpi - 1.5x
xhdpi - 2.0x
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
Optimalizace vzhledurůzné velikosti displeje
small
normal
large
xlarge
- ošetřit scrollování obrazovkyScrollView
ListView, GridView
Optimalizace vzhleduaktuální stav
Resourcy - jednotky
dp - density-independent pixel
sp - scale-independent pixel
nepoužívat px
Resourcy
v kódu přístupné skrz R.java před své identifikátory
správná verze resourcu je zvolena za běhu podle aktuální konfigurace
Resource kvalifikátorykoncovky složek resourců, které určují k jaké konfiguraci se obsah vstahuje
en, cs, fr, en-rUS
small, normal, large, xlarge
port, land
ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi
v4, v11
sw<N>dp - sw600dp
w<N>dp - w720dp
h<N>dp - h480dp
lze kombinovat
Fragmentace verzí OS
aplikaci překládám vůči build targetu
project.properties - target=android-17
aplikaci lze pustit na zařízeních v rozmezí definovaném v manifestu
AndroidManifest.xml <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
Fragmentace verzí OSif (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) { // pouze na novějším OS než Android 2.3}
private static boolean fragmentsSupported = false;
private static void checkFragmentsSupported() throws NoClassDefFoundError { fragmentsSupported = android.app.Fragment.class != null;}
static { try { checkFragmentsSupported(); } catch (NoClassDefFoundError e) { fragmentsSupported = false; }}
Fragmentykousky aplikačního UI
s příchodem tabletů je nutné řešit rozdílné dělení do obrazovek
Fragmentyfragment != aktivita
je to část aktivity
od Androidu 3.0
support knihovna v4 backportuje do Androidu 1.6+
díky fragmentům lze vytvořit jednu aplikaci pro telefony i tablety
lze měnit za běhu, ukládat na backstack
lze vytvářet fragmenty bez UI - worker fragment
Vláknahlavní vlákno = UI vlákno
neblokujte hlavní vlákno
pro časově náročné oprace nutné vytvářet background vlákna
k UI nutné vždy přistupovat pouze v hlavním vlákně
networking a IO operace je třeba dělat v background vlákně
detaily v příští přednášce
ActionBarUI a navigační prvek moderních aplikací
od Androidu 3.0
knihovna ActionBarSherlock backportuje do Androidu 2.x
Menupro < Android 3.0 schováno pod menu tlačítkem
Android 3.0+ v ActionBaru
položky mohou být zobrazeny v ActionBaru
při nedostatku místa se zobrazují v overflow menu v ActionBaru nebo pod hw menu tlačítkem (pokud ho zařízení má)
menu resource
Logovánítřída android.util.Log
zobrazeny v ddms nebo IDE
Toastnemodální informace pro uživatele
Toast.makeText(MainActivity.this, R.string.my_toast_text, Toast.LENGTH_SHORT).show();
Dialogy
plovoucí okno aplikace
standardní dialogy
ProgressDialog
AlertDialog
vlastní dialogy
nyní používat s pomocí DialogFragmentu
Notifikacezpráva pro uživatele zobrazená ve status baru
uživatel může otevřít notification drawer pro detail
lze definovat UI a click akci
NotificationCompat.Builder
Preferences
SharedPreferences.Editor editor = prefs.edit();editor.putInt(SOME_KEY, storedValue);editor.commit();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int storedValue = prefs.getInt(SOME_KEY, defaultValue);
SharedPreferences prefs = config.getSharedPreferences(PREFS_FILE_NAME, Activity.MODE_PRIVATE);
Odkazyhttp://developer.android.com
http://android-developers.blogspot.com
http://source.android.com
http://stackoverflow.com/questions/tagged/android
http://www.youtube.com/androiddevelopers
... to be continued