Android è un framework, un sistema a strati orientato al mobile contenente un sistema operativo, middleware e alcune applicazioni chiave. Il sistema operativo sottostante è Linux che è general purpose e quindi contiene solo funzionalità base.

Per creare Android gli sviluppatori di applicazioni, gli operatori di telefonia mobile, i produttori di chip ecc... hanno creato un consorzio che sviluppa gli standard, l'OHA Open Handset Alliance, è quindi un sistema aperto.

L'architettura è a strati, alla base vi è il kernel Linux, al di sopra le varie librerie e il runtime Android, ancora sopra il framework ed infine le nostre applicazioni.

Kotlin è un linguaggio che deriva da Java ed è compatibile con esso, ha il vantaggio di ridurre il codice boilerplate e di gestire meglio i null pointer.

Le applicazioni seguono il pattern mvc (model view controller), i componenti di una classica applicazione sono: la view, cioè l'interfaccia utente, la classe Activity cioè il controller della view, le varie Activity parlano tra loro tramite gli Intents. In alcuni casi si usano anche i Servizi, i Content Providers (il model) e i Broadcast Receivers.

Le views possono essere costruite completamente in Java oppure usando un file di configurazione in xml. Ci sono poi i files di layout sempre in xml per fare in modo che l'app si adatti ai vari dispositivi.

Le Activity hanno un Activity Manager che gestisce le attività, le quali possono essere in uno dei seguenti stati: starting, running, stopped, destroyed, paused, solo un'attività per volta può essere in stato running, il cambio di stato è intercettato tramite i lifecycle methods (onCreate, onPause, onStop, onDestroy).

Gli Intents sono messaggi asincroni, possono essere espliciti se si specifica il destinatario del messaggio oppure impliciti se non si sa quale sarà l'applicazione di destinazione, ad esempio non sappiamo quale player video è predefinito sul dispositivo dell'utente. Ogni Activity dichiara le proprie capacità e quindi quali Intents può ricevere.

I Servizi girano in background, non hanno GUI e si usano per i task non interattivi (ad esempio il collegamento alla rete). Hanno un ciclo divita in 3 fasi: starting, running e destroyed.

I Content Providers: ogni app ha un insieme di dati privati, ma si potrebbe aver bisogno di dati che appartengono ad altre applicazioni, ogni applicazione espone alcuni dei propri dati agli altri usando formati standard.

I Broadcast Receivers usano il pattern publish/subscribe, ricevono i messaggi di sistema.

Per la distribuzione dell'app viene creato un file .apk che contiene il Byte-code Java, le risorse (immagini, file si configurazione ecc..) e le varie librerie. Ogni app deve essere firmata con una chiave prima della distribuzione.

I permessi sono dichiarati staticamente nel file Androidmanifest.xml, l'utente deve dare il consenso a questi permessi durante l'installazione o al momento dell'esecuzione, in mancanza di permessi l'app non da errore ma non funziona.

Un'app può girare su diversi thread: il thread UI è quello che deve essere responsive all'interazione dell'utente, non può eseguire operazioni bloccanti per lungo tempo, gli altri thread sono quelli a cui si delegano tutte le operazioni lunghe o comunque di durata imprevedibile.

Al lancio di un'app Android crea un singolo thread main che gestisce UI, non bisogna eseguire operazioni lunghe obloccanti in questo thread per non rallentare l'interattività della UI. Esiste la classe AsyncTask che contiene i metodi doInBackground e onPostExecute e bisogna derivare le nostre classi da questa per fare cose come scaricare un'immagine.

Poichè Android è in continua evoluzione è necessario stabilire quale è la più vecchia versione che si vuole supportare.

Per attivare le opzioni sviluppatore sul telefono Android 14 tappare 7 volte su Versione build, comparirà la voce Opzioni sviluppatore nel menu del telefono. Poi attivare Debug USB e il telefono comparirà nella lista dei dispositivi su Android studio