Introduzione alle attività

La classe Activity è un componente fondamentale di un'app Android e il modo in cui le attività vengono avviate e assemblate è una parte fondamentale del modello di applicazione della piattaforma. A differenza dei paradigmi di programmazione in cui le app vengono avviate con un metodo main(), il sistema Android avvia il codice in un'istanza Activity richiamando metodi di callback specifici che corrispondono a fasi specifiche del suo ciclo di vita.

Questo documento introduce il concetto di attività e poi fornisce alcune linee guida leggere su come utilizzarle. Per ulteriori informazioni sulle best practice per la progettazione di app, consulta la Guida all'architettura delle app.

Il concetto di attività

L'esperienza sulle app per dispositivi mobili differisce dalla controparte desktop per il fatto che l'interazione di un utente con l'app non inizia sempre nello stesso punto. Invece, il percorso dell'utente spesso inizia in modo non deterministico. Ad esempio, se apri un'app email dalla schermata Home, potresti visualizzare un elenco di email. Al contrario, se usi un'app di social media che avvia poi la tua app email, potresti andare direttamente alla schermata dell'app per scrivere un'email.

La classe Activity è progettata per facilitare questo paradigma. Quando un'app ne richiama un'altra, l'app chiamante richiama un'attività nell'altra app, anziché l'app come tutto atomico. In questo modo, l'attività funge da punto di contatto per l'interazione di un'app con l'utente. Implementi un'attività come sottoclasse della classe Activity.

Un'attività fornisce la finestra in cui l'app disegna la UI. In genere questa finestra occupa tutto lo schermo, ma potrebbe essere più piccola rispetto a quella visualizzata e fluttuare sopra altre finestre. In genere, un'attività implementa una schermata in un'app. Ad esempio, per una delle attività di un'app è possibile implementare una schermata Preferenze, mentre un'altra attività implementa una schermata Seleziona foto.

La maggior parte delle app contiene più schermate, il che significa che includono più attività. In genere, un'attività in un'app viene specificata come attività principale, ovvero la prima schermata che appare quando l'utente avvia l'app. Ogni attività può quindi avviare un'altra attività per eseguire azioni diverse. Ad esempio, l'attività principale in una semplice app di posta può fornire la schermata che mostra la posta in arrivo. Da qui, l'attività principale potrebbe avviare altre attività che forniscono schermate per attività come la scrittura di email e l'apertura di singole email.

Sebbene le attività interagiscano insieme per formare un'esperienza utente coerente in un'app, ciascuna di esse è strettamente legata alle altre; di solito, le dipendenze tra le attività in un'app sono minime. Di fatto, le attività spesso avviano attività appartenenti ad altre app. Ad esempio, un'app di un browser potrebbe avviare l'attività di condivisione di un'app di social media.

Per utilizzare le attività nella tua app, devi registrarne le relative informazioni nel manifest dell'app e devi gestire in modo appropriato i cicli di vita delle attività. Il resto del documento introduce questi argomenti.

Configurazione del manifest

Affinché la tua app possa utilizzare le attività, devi dichiarare le attività e alcuni dei loro attributi nel file manifest.

Dichiara le attività

Per dichiarare la tua attività, apri il file manifest e aggiungi un elemento <activity> come elemento secondario dell'elemento <application>. Ecco alcuni esempi:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

L'unico attributo obbligatorio per questo elemento è android:name, che specifica il nome della classe dell'attività. Puoi anche aggiungere attributi che definiscono le caratteristiche dell'attività, come etichetta, icona o tema dell'interfaccia utente. Per ulteriori informazioni su questi e altri attributi, consulta la documentazione di riferimento dell'elemento <activity>.

Nota: dopo aver pubblicato l'app, non devi modificare i nomi delle attività. Se lo fai, potresti interrompere alcune funzionalità, ad esempio le scorciatoie delle app. Per ulteriori informazioni sulle modifiche da evitare dopo la pubblicazione, consulta la sezione Aspetti che non possono cambiare.

Dichiarare i filtri per intent

I filtri per intent sono una funzionalità molto potente della piattaforma Android. Forniscono la possibilità di avviare un'attività basata non solo su una richiesta esplicita, ma anche su una implicita. Ad esempio, una richiesta esplicita potrebbe indicare al sistema di avviare l'attività di invio di email nell'app Gmail. Al contrario, una richiesta implicita dice al sistema di avviare una schermata di invio di email in qualsiasi attività che possa svolgere il lavoro. Quando la UI di sistema chiede a un utente quale app usare per eseguire un'attività, si tratta di un filtro per intent.

Puoi sfruttare questa funzionalità dichiarando un attributo <intent-filter> nell'elemento <activity>. La definizione di questo elemento include un elemento <action> e, facoltativamente, un elemento <category> e/o un elemento <data>. Questi elementi si combinano per specificare il tipo di intent a cui l'attività può rispondere. Ad esempio, il seguente snippet di codice mostra come configurare un'attività che invii dati di testo e riceve richieste da altre attività per farlo:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

In questo esempio, l'elemento <action> specifica che questa attività invia dati. Dichiarare l'elemento <category> come DEFAULT consente all'attività di ricevere le richieste di avvio. L'elemento <data> specifica il tipo di dati che questa attività può inviare. Il seguente snippet di codice mostra come chiamare l'attività descritta sopra:

Kotlin

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

Java

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
Se vuoi che la tua app sia autonoma e non vuoi consentire ad altre app di attivare le sue attività, non hai bisogno di altri filtri per intent. Le attività che non vuoi rendere disponibili ad altre applicazioni non devono avere filtri per intent e puoi avviarle autonomamente utilizzando intent espliciti. Per ulteriori informazioni su come le tue attività possono rispondere agli intent, consulta Intent e filtri di intent.

Dichiara le autorizzazioni

Puoi utilizzare il tag <activity> del file manifest per stabilire quali app possono avviare una determinata attività. Un'attività principale non può avviare un'attività secondaria a meno che entrambe le attività non abbiano le stesse autorizzazioni nel file manifest. Se dichiari un elemento <uses-permission> per un'attività principale, ogni attività secondaria deve avere un elemento <uses-permission> corrispondente.

Ad esempio, se la tua app vuole utilizzare un'ipotetica app denominata SocialApp per condividere un post sui social media, SocialApp stessa deve definire l'autorizzazione che l'app che la chiama deve avere:

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

Dopodiché, per poter chiamare SocialApp, la tua app deve corrispondere all'insieme di autorizzazioni nel file manifest di SocialApp:

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

Per ulteriori informazioni sulle autorizzazioni e sulla sicurezza in generale, vedi Sicurezza e autorizzazioni.

Gestione del ciclo di vita delle attività

Nel corso della sua vita, un'attività passa attraverso una serie di stati. Puoi utilizzare una serie di callback per gestire le transizioni tra stati. Le seguenti sezioni introducono questi callback.

onCreate()

Devi implementare questo callback, che si attiva quando il sistema crea la tua attività. L'implementazione deve inizializzare i componenti essenziali della tua attività: ad esempio, l'app deve creare viste e associare i dati agli elenchi qui. Ancora più importante, è qui che devi chiamare setContentView() per definire il layout dell'interfaccia utente dell'attività.

Al termine di onCreate(), il callback successivo è sempre onStart().

onStart()

Quando onCreate() esce, l'attività entra nello stato Iniziato e diventa visibile all'utente. Questo callback contiene i preparativi finali dell'attività per entrare in primo piano e diventare interattivo.

(())

Il sistema richiama questo callback appena prima che l'attività inizi a interagire con l'utente. A questo punto, l'attività si trova in cima allo stack delle attività e acquisisce tutti gli input utente. La maggior parte delle funzionalità di base di un'app è implementata nel metodo onResume().

Il callback onPause() segue sempre onResume().

onPause()

Il sistema chiama onPause() quando l'attività perde lo stato attivo ed entra in stato In pausa. Questo stato si verifica, ad esempio, quando l'utente tocca il pulsante Indietro o Recenti. Quando il sistema chiama onPause() per la tua attività, tecnicamente significa che la tua attività è ancora parzialmente visibile, ma il più delle volte indica che l'utente sta abbandonando l'attività e che a breve l'attività passerà allo stato Arrestata o Ripresa.

Un'attività in stato In pausa può continuare ad aggiornare l'interfaccia utente se l'utente prevede che venga aggiornata. Ecco alcuni esempi di attività che mostrano la schermata di una mappa di navigazione o un media player in riproduzione. Anche se queste attività perdono l'attenzione, l'utente si aspetta che l'interfaccia utente continui a essere aggiornata.

Non devi utilizzare onPause() per salvare i dati utente o delle applicazioni, effettuare chiamate di rete o eseguire transazioni sul database. Per informazioni sul salvataggio dei dati, consulta Salvataggio e ripristino dello stato dell'attività.

Al termine dell'esecuzione di onPause(), il callback successivo sarà onStop() o onResume(), a seconda di ciò che accade dopo che l'attività entra nello stato In pausa.

onStop()

Il sistema chiama onStop() quando l'attività non è più visibile all'utente. Ciò può accadere perché l'attività è in fase di eliminazione, è in corso una nuova attività o un'attività esistente sta entrando in uno stato Ripreso e copre l'attività interrotta. In tutti questi casi, l'attività interrotta non è più visibile.

Il callback successivo chiamato dal sistema è onRestart(), se l'attività torna per interagire con l'utente, oppure onDestroy() se l'attività viene terminata completamente.

onRiavvia()

Il sistema richiama questo callback quando un'attività in stato Arrestata sta per essere riavviata. onRestart() ripristina lo stato dell'attività dal momento in cui è stata interrotta.

Questo callback è sempre seguito da onStart().

onDestroy()

Il sistema richiama questo callback prima che un'attività venga eliminata.

Questo callback è l'ultimo ricevuto dall'attività. onDestroy() viene solitamente implementato per garantire che tutte le risorse di un'attività vengano rilasciate quando l'attività o il processo che la contiene viene distrutto.

Questa sezione offre solo un'introduzione a questo argomento. Per un'analisi più dettagliata del ciclo di vita dell'attività e dei relativi callback, consulta Il ciclo di vita delle attività.