Android Glossary [CA]
https://github.com/codepath/android_guides/wiki/
Application
Una Aplicació en Android és la unitat lògica d'execució. Es correspon a un procés Linux gestionat per el sistema operatiu Android.
Empaca dintre d'un zip reanomenat APK
- codi compilat: bytecode y llibreries natives
- metadades
- recursos
A cada aplicació li és assignat un UUID (identificador únic d'usuari). Molt semblant al que es fa amb els dimonis de sistema de Linux. Els usuaris del sistema no son només persones sinó principalment aplicacions. Es una primera capa d'aïllament entre aplicacions. A més cada aplicació s'executa en un entorn virtual aïllat.
Activity
Una activitat en Android es una interfície d'usuari, una pantalla. Es el concepte anàlog a finestra o pantalla en les applicacions GUI d'escriptori. La diferència són les limitacións que s'imposen en com l'usuari pot interaccionar amb elles. No amb el contingut sino amb elles en si. Les finestres les pots obrir, tancar, moure, redimensionar... Les activitats només pots obrirles o tirar enrere.
Task
Aquest fluxe de finestres de la mateixa applicació es el que es diu tasca. Les organitza a mode de pila. Quan arrenca l'aplicació s'obre l'anomenada activitat principal que es situa a la base de la pila. Si la activitat principal llença una nova activitat, la nova activitat queda com a activa al damunt i la principal desactivada a sota. Només quan la nova activitat es tanca, per exemple, tirant endarrera, que la activitat principal torna a activar-se.
Intent
Una intenció es un punt d'entrada declarat a les metadades per a una aplicació. Es correspon amb una activitat principal y certes dades que li serán proveides o s'especifiquen a les metadades.
La majoria d'aplicacions tenen com a mínim la intenció per ser llençades des del llençador d'applicacions. Pero poden definir-ne d'altres, per exemple, al botó de compartir, per obrir un cert tipus de dades, o quan es produeix un cert esdeveniment.
Les aplicacions es poden comunicar fent servir els intents exposats
Life cycle
Aplicacions, tasques i activitats tenen un cicle de vida controlat pel sistema.
Per exemple, en el cas concret de les Activitats, Android defineix crides que cadascuna pot sobrescriure en cada transició. Els noms dels estats no són oficials. Android només defineix les transicions, no pas els estats.
- Apagada: No está disponible al sistema
- ↓onCreate↓ ↑onDestroy↑
- Parada: Carregada en memòria pero no visible
- ↓onStart↓ ↑onStop ↑
- Visible: Visible a l'usuari, pero sense interacció
- ↓onResume↓ ↑onPause↑
- Active: Pot rebre la interacció del usuari.
Fragment
Un fragment és una disposició d'elements d'interficie que es pot reutilitzar en diferents activitats. Aporta estructura, modularitat i reús.
Es defineix en xml i amb codi semblant a com es defineix una activitat.
Views
Les vistes son elements que componen una UI. En Qt, Widgets. En React, Components.
Widgets
Son views autocontingudes.
android.widget.TextView
: Displays textandroid.widget.EditText
: Input fieldandroid.widget.Button
: Clickable buttonandroid.widget.ImageView
: Displays an imageandroid.widget.CheckBox
: Toggle checkboxandroid.widget.Switch
: On/off toggleandroid.widget.ProgressBar
: Shows loadingandroid.widget.SeekBar
: Slider input
View Groups
Els grups de vistes són vistes que serveixen per contindre altres vistes. Els grups organitzen com es veuen les vistes contenides.
android.widget.LinearLayout
Arranges views in a row or columnandroid.widget.RelativeLayout
Positions views relative to each other (older)androidx.constraintlayout.widget.ConstraintLayout
Modern flexible layoutandroid.widget.FrameLayout
Simple stacking layoutandroidx.recyclerview.widget.RecyclerView
Efficient list/grid containerandroid.widget.ScrollView
Makes content scrollable vertically
Atributs comuns de les vistes
android:orientation
(Container) Defineix quin és l'eix principal. L'altre eix serà el de creuament. Valors:vertical
ohorizontal
Equivalent CSS:flex-direction
android:gravity
(Container) Cap a on 'cauen' els fills Valors: Es poden combinar un valor verticals amb un d'horitzontal amb una|
left
,right
,start
,end
,center_horizontal
,fill_horizontal
top
,bottom
,center_vertical
,fill_vertical
center
,fill
afecten als dos eixos.- Per exemple, en un layout linial, no tè efecte en l'eix principal.
- Equivalent al
align-items
del css flexbox
android:layout_gravity
(Children) Bescanvia el gravity del container per aquest fill en concret.- Equivalent al
item-align
del css flexbox
- Equivalent al
android:layout_weight
Es fa servir quan al contenidor hi ha espai per expandir més enllà del mínim. De l'espai disponible a aquesta vista se li asignarà la mateixa proporció que la que hi ha entre aquest pes i la suma dels pesos dels germans.android:layout_height/width
wrap_content
: ajusta al tamany requerit pels fillsadapt_parent
: expandeix al tamany del pare0dp
:
android:gravity
Donde se colocaran los hijos. Como el align o el text-align del css.android:layout_gravity
Equivalent alself-align
del css. En un LinearLayout només affecta al cross axis.
Coses
post
es un metode de View que crida el block paràmetre després
de l'actual cicle de dibuixat, evitant que es recalculin coses
en mig del dibuixat.
dp
es una unitat de pixel virtual independent de la densitat
que correspon a un pixel en una densitat de 160 dpi (normal
).
sp
es una unitat de pixel virtual independent per a fonts,
que no només inclou la densitat sinó que contempla les
preferències d'usuari pel tamany de font.
px
representa pixels físics i no es recomana fer-ho servir.
Source layout
El codi font d'un projecte Gradle per Android s'organitza en mòduls i els mòduls en conjunts de fonts (source sets)
project_root/<module>/src/<source-set>/
Mòdul: És un conjunt de fonts (codi i recursos) que es pot construir independentment. Normalment esdevé a una aplicació (APK/AAB), una llibreria (AAR), extensió (???)...
Els mòduls poden dependre entre ells però només unidireccionalment.
Source set: Es un conjunt de fonts que s'inclouen en un mòdul si es compleixen certes condicions.
main
: s'inclou sempredebug
: només en mode desenvolupamentrelease
: només al build d'usuariandroidTest
: testos d'instrumentació (executats a un dispositiu Android)test
: testos locals (executats a la maquina de desenvolupament)paid
,free
,demo
...: varietats, sabors o flavors del mòdul
Quedant una estructura semblant a aquesta:
project_root/
gradle.build # defineix els moduls
module1/
gradle.build # defineix els source-sets
src/
main/
debug/
release/
test/
androidTest/
flavor1/
flavor2/
module2/
Build type:
Defineix com es genera el component.
Es defineixen a la clau buidTypes {}
de gradle.build
i per defecte son debug
i release
.
A cada build type li correspon el seu source set.
Varietat (flavor): Literalment sabors (com als iogurts!). Es fa servir per diferents versions del programari que volem publicar. Per exemple, una demo, una versió shareware, una versió premium, una versió especial nadal...
Variant: Combinació de diferents source sets. Ho fa el gradle, no hem de crear source-sets per les combinacions. Exemple: paidRelease
Gradle, a part de les tasques globals
(build, test, install, lint...)
genera targets específics per cada variant:
testFlavor1Debug
nomes testejaria el flavor1 en versió de debug.
Dimensions de varietats (flavor dimensions): Per defecte les varietats son mutuament exclusives. Si volem combinar-les, cal definir dimensions. Les varietats d'una dimensió segueixen sent mutuament exclusives entre elles, però, podem combinar varietats de diferents dimensions.
Per exemple, podem tenir una dimensió de 'region' (eu, us), una altre 'monetization' (free, paid, premium), una altre 'holidays' ('none', 'halloween', 'easter', 'christmas')...
Es defineixen al gradle.build
. Per exemple:
flavorDimensions "monetization", "holiday"
productFlavors {
free { dimension "monetization" }
paid { dimension "monetization" }
easter { dimension "holiday" }
christmas { dimension "holiday" }
}
Produeixen les variants freeEasterDebug
, paidChristmasRelease
...
Sistema de recursos
Els recursos d'una aplicació s'identifiquen, dins d'un mòdul per un tipus i un id i poden tenir versions específiques per diferents configuracions de dispositiu identificades per un conjunt de qualificadors, que corresponen a idioma, resolució...
La potència dels recursos es que li demanem al sistema un recurs per (modul), tipus i id, i el sistema ens retorna la versió del recurs que millor s'adapta a la nostra configuració. Ens estalviem aquesta lògica de selecció.
Referint recursos
Per referenciar un recurs dins del codi,
fem servir el paquet R
dins del namespace
del projecte (import com.example.myapp.R
)
R.<type>.<id>
R.mipmap.ic_launcher
Si és un recurs d'un altre mòdul podem explicitar el mòdul amb el seu identificador únic:
com.explicit.module.R.type.id
Com a detall d'implementació que a vegades apareix,
l'expressió retorna un id numèric intern pel recurs.
Normalment fem servir funcions o atributs que acepten aquest sencer
i de forma transparent el fan servir per obtenir l'objecte concret.
Per exemple, getText(Int)
per obtindre el text traduit.
Des d'un xml, un recurs es referencia com @type/id
si es al mateix mòdul
o sinó, @com.explicit.module:type/id
.
Els podem fer servir com a valors dels atributs quan siguin del tipus correcte.
Creant versions dels recursos
https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources
Una versió d'un recurs estarà,
dins d'un mòdul a:
<modul>/res/<tipus>[-<qualificador1>[-<qualificador2>]]/<id>.<extensio>
Per exemple la icona d'aplicació (launcher icon),
es un recurs de tipus mipmap
amb id ic_launcher
.
Podem aportar diferents versions segons densitat de pantalla i versió d'Android.
res/mipmap-xxxhdpi/ic_launcher.xml # Per dispositius
res/mipmap-anydpi-v26/ic_launcher.xml # Per dispositius suportant
Els qualificadors poden ser, per prioritat:
- País i xarxa mobil: (
mcc
/mnc
) (Mobile Country Code i Mobile Network Code) Exemplemcc208-mnc00
Vol dir a Francia fent servir xarxa d'Orange - Idioma:
ca
,ca-rFR
- Direcció de lectura: (layoutDirecxpiton API 17)
ldltr
ldrtl
(layout direction) - Dimensió mes petita: (smallestWidthDp API 13) El tamany més estret d'altura o amplada
sw<N>dp
- Mínima amplada o altura: (screenWidth/HeightDp API 13)
w<N>dp
oh<N>dp
aplica a dimensions majors o igual que l'especificada - Mínim tamany de pantalla: (screenLayout API 4)
small
320x426,normal
320x470,large
480x640,xlarge
720x960 (API 9) - Aspecte de la pantalla: (screenLayout API 4)
long
,notlong
Si es pantalla ampla > 4/3 - Pantalla rodona: (isScreenRound API 23)
round
,notround
Per rellotges i similars. - Gamut de color ample: (isScreenWideColorGamut API 26)
widecg
,nowidecg
- Interval dinamic ample (HDR): (isScreenHdr)
highdr
,lowdr
- Orientació de la pantalla: (orientation)
port
,land
- Mode d'interficie: (uimode)
car
desk
television
appliance
watch
vrheadset
- Mode nocturn:
night
notnight
- Densitat de pixels:
ldpi
.mdpi
,hdpi
,xhdpi
,xxhdpi
,xxxhdpi
,nodpi
,tvdpi
,anydpi
,<nnn>dpi
- Touch screen: (
touchscreen
)notouch
,finger
- Keyboard available:
keysexposed
,keyshidden
,keyssoft
- Hardware Keyboard:
nokeys
,qwerty
,12key
- Navigation kayes available:
navexposed
,navhidden
- Non touch navigation:
nonav
,dpad
,trackball
,wheel
- Platform version:
v<N>
Apply for API N or higher
Selecció de la versió apropiada
- Primer filtra les versions del recurs amb qualificadors incompatibles
- Després fins que només quedi un, per a tot tipus de qualificador per ordre de prioritat
- Si una versió te el qualificador, es descarten els que no el tinguin
- En el cas concret de la Densitat, descarta també les que funcionin pitjor
Les icones d'aplicació (launcher icons)
son recursos de tipus mipmap
amb el nom ic_launcher
.
Per suportar diferentes versions es col·loquen a diferents
directoris res/mipmap-qualifier1-qualifier2
.
Per les icones els qualificadors típics son
densitat de pixels (xhdpi
)
i minim api level (v23
)
pero també pot afegir-se idioma, regio, tamany de pantalla, orientació de pantalla...
Els qualificadors han d'anar ordenats.
https://developer.android.com/guide/topics/resources/providing-resources#BestMatch
Si un mateix id es troba en directoris amb qualificadors, el sistema de recursos:
- elimina els directoris amb qualificadors que no apliquen
- per ordre de prioritat de qualificadors,
In code:
R.type.id
like in R.mipmap.ic_launcher
Icones d'aplicació (launcher icons)
Criteris de disseny
- Dissenyats a 108 pixels.
- Zona util de 66
Sistema de recursos
Els recursos de
En codi R.type.id
, per exemple R.mipmap.ic_launcher
.
A un xml @type/id
Les icones d'aplicació (launcher icons)
son recursos de tipus mipmap
amb el nom ic_launcher
.
Per suportar diferentes versions es col·loquen a diferents
directoris res/mipmap-qualifier1-qualifier2
.
Per les icones els qualificadors típics son
densitat de pixels (xhdpi
)
i minim api level (v23
)
pero també pot afegir-se idioma, regio, tamany de pantalla, orientació de pantalla...
Els qualificadors han d'anar ordenats.
El sistema de recursos:
- elimina els qualificadors que no apliquen
Desplegament
A partir d'Android 1.0 (API 1) es suporten les icones rasters cal posar-les en diferent densitat: ldpi x0.75, mdpi x1, hdpi x1.5, xhdpi x2, xxhdpi x3, xxxhdpi x4 La resolució de referència es mdpi, Per el launcher la referència es de 48. No es recomana ficar la resolució ldpi.
res/mipmap-mdpi/ic_launcher.png # 48
res/mipmap-hdpi/ic_launcher.png # 72
res/mipmap-xhdpi/ic_launcher.png # 96, API 8
res/mipmap-xxhdpi/ic_launcher.png # 144, API 16
res/mipmap-xxxhdpi/ic_launcher.png # 192, API 18
A partir d'Android 4.0 (API 14) via llibreria VectorDrawableCompat
i a partir d'Android 5.0 (API 21) de forma nativa,
es suporten els VectorDrawables, vectorials.
Són molt semblats a svg's pero més limitats
i amb funcionalitats específiques.
La resolució base del launcher deixa de ser 48 dp i passa a ser 108 dp.
https://developer.android.com/guide/topics/resources/drawable-resource
A partir d'Android 8.0 (API 26) es suporten les icones adaptatives
que es defineixen per capes background
pel fons i
foreground
pel motiu principal.
Això permet fer alguns efectes animant les capes per separat.
Si cal suportar versions anteriors:
Si no a:
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
Les capes referenciades poden ser raster o vectorials, s'escullen seguint les mateixes normes.
A partir d'Android 13 (API 33) es suporten les icones themables,
que afegeixen una nova capa monochrome
a una tinta
que permet adaptarla al tema del sistema o de l'aplicació.
Si cal suportar versions anteriors:
Si no a: