1. ANDROID: ACTIVITY E INTENT
Simone Compagnone matr. 709649
Marco Covelli matr. 702957
Paola Percuoco matr. 742072
2. ACTIVITY
Un'activity può essere vista come la rappresentazione di una
schermata
2
es. Android Dropbox
3. ACTIVITY – INTERFACCIA GRAFICA
L'interfaccia grafica di un’activity è in genere definita da una
o più view, organizzate in una struttura ad albero e
rappresentate sullo schermo tramite il layout (o group view).
ViewGroup
ViewGroup View View
View View View
3
4. ACTIVITY E BACK STACK - 1
Un’applicazione di solito contiene più activity
Ciascuna activity può farne partire un’altra, anche di una
differente applicazione
Ogni volta che una nuova activity viene eseguita, è impilata
nel back stack e la precedente viene fermata
Quando l’utente preme il tasto BACK, l’activity in primo
piano viene distrutta e il controllo torna a quella precedente
4
6. LE ACTIVITY IN JAVA
Una Activity è una classe java che estende la classe
android.app.Activity
import android.app.Activity;
public class ExampleActivity extends Activity { ... }
È necessario dichiarare l’activity implementata nel file
AndroidManifest.xml affinché il sistema possa
eseguirla:
<manifest ... >
<application ... >
<activity android:name="ExampleActivity" />
...
</application ... >
...
</manifest >
6
7. ACTIVITY - STATI
resumed/running: attiva, in primo piano nello schermo
paused: parzialmente coperta da un’altra attività in primo
piano
è mantenuta in memoria
è legata al window manager
può essere uccisa dal sistema nel caso di scarsa memoria
disponibile
stopped: completamente oscurata da un'altra (è in
"background")
è mantenuta in memoria
non è più legata al window manager (non più visibile)
può essere uccisa dal sistema nel caso di scarsa memoria
disponibile
7
9. ACTIVITY – SALVATAGGIO DI STATO
Esempio particolare: quando l’utente passa da portrait a
landscape, o viceversa, l’activity in primo piano viene distrutta
e ricreata completamente
Per salvare i dati, preservandoli dalla distruzione dell’activity, è
possibile fare l’override del metodo onSaveInstanceState()
dell’activity stessa
L’implementazione di default di onSaveInstanceState() salva
automaticamente lo stato delle view e dei layout dell’activity
9
11. ACTIVITY – ENTRY POINT
Un’applicazione può avere più di un «entry point»
Il sistema può eseguire qualsiasi activity di un’applicazione,
purché l’activity stessa «manifesti» tale possibilità
Un’applicazione dovrebbe dichiarare comunque l’entry point
principale, cioè l’activity che deve essere eseguita all’avvio
dell’applicazione dal launcher di sistema
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
11
12. INTENT
Un intent è un messaggio che viene scambiato tra tre delle
componenti base di un'applicazione Android (Activity,
Broadcast Receiver e Service)
Gli intent legano i componenti fra loro a
run-time pur appartenendo ad
applicazioni diverse
Il sistema si preoccupa di recapitare tali
messaggi ai corretti destinatari
Un intent è definito nella javadoc della
classe android.content.Intent ed è un
object di tipo Intent
12
14. INTENT – INFORMAZIONI
Un intent è costituito da:
le informazioni di interesse per la componente che lo riceve
(azione da intraprendere e i dati per agire)
le informazioni per il sistema Android (ad esempio chi e come
deve gestire l'intent)
Principalmente, può contenere i seguenti dati:
action
category
component name
data
extras
flags
14
15. INTENT – ACTION
Contiene una stringa che identifica un'azione da eseguire o
nel caso del broadcast intents, è un report di una azione che è
stata compiuta e quindi segnalata
Metodi : setAction() e getAction()
es: intent.setAction(android.content.Intent.ACTION_CALL);
15
16. INTENT – CATEGORY
Sono stringhe che contengono informazioni aggiuntive sul tipo
di componente che deve gestire l'intent
Il sistema Android utilizza queste informazioni per decidere a
quale componente recapitare il messaggio
Metodi: addCategory() , removeCategory() e getCategories()
16
17. INTENT – DATA
In questo campo è possibile associare all'intent alcuni dati
utili all'applicazione che risponderà al messaggio
All'interno del campo data dell'intent vengono memorizzati
gli URI e il tipo MIME ( ex. image/jpeg ) del dato stesso
Solitamente il campo Data è associato al campo Action, le
quali sono legate ai dati con diversi tipi di specificazioni, ad
esempio:
ACTION_CALL - tel: URI
ACTION_VIEW - http: URI
ACTION_EDIT - file:URI
17
18. INTENT – COMPONENT NAME
Riguarda il nome del componente che dovrà gestire l'intent
Questo campo è un oggetto ComponentName ed è composto
da:
nome completo della classe del componente di destinazione
nome del pacchetto impostato nel file manifesto dell'applicazione
in cui risiede il componente
Metodi: setComponent() , getComponent() , setClassName()
Anche questo campo è opzionale. Se è impostato, l'oggetto
intent verrà consegnato ad un'istanza della classe designata.
Se non è impostato, Android utilizza altre informazioni
nell'oggetto Intent per individuare una applicazione target
18
19. INTENT - INTENT RESOLUTION
Questo aspetto riguarda la gestione e lo "smistamento" degli
intent da parte del sistema Android
Gli Intent si dividono in:
intent esplicito: è un messaggio che esplicita sia il nome del
componente di destinazione che l'azione da eseguire
Intent implicito: si specifica solo l'azione da eseguire senza
esplicitare il nome del componente di destinazione
Per gli intent impliciti, il sistema Android sceglie
l'applicazione a cui destinare il messaggio a seconda dei filtri
impostati nei manifest file delle singole applicazioni.
19
20. INTENT - INTENT FILTERS
I filtri vengono usati per identificare quali intent
l'applicazione è in grado di ricevere e gestire
Devono essere specificati nel file AndroidManifest.xml delle
applicazioni, che verrà consultato dal sistema Android per
decidere a chi consegnare l' intent implicito
Gli intent espliciti vengono sempre consegnati a destinazione
(non vengono consultati i filtri dell'applicazione)
Ogni componente (activities, services e broadcast receivers)
può avere uno o più filtri
20
21. INTENT - INTENT FILTERS(2)
Esempio di filtro nel AndroidManifest.xml:
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT"/>
<action android:name="com.example.project.SHOW_RECENT"/>
<data android:mimeType="video/mpeg" android:scheme="http“ …/>
</intent-filter>
NB. Se un intent ha ad esempio i campi Data ed Action non vuoti, può
essere consegnato all'applicazione solo se entrambi i campi
possono essere filtrati 21
22. ACTIVITY E INTENT – ESEMPIO 1
Esempio di intent esplicito e chiamata startActivity()
public class ExampleActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button testButton1 = (Button)findViewById(R.id.testButton1);
testButton1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(this, AnotherActivity.class);
startActivity(intent);
}
});
}
}
22
23. ACTIVITY E INTENT – ESEMPIO 2
Esempio di intent implicito e chiamata startActivityForResult()
private void pickContact() {
// Crea un intent per cercare un contatto, come definito in ContactContract
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.AUTHORITY_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Se la richiesta è andata bene (OK) e la richiesta è PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
// Fa una query sul content provider dei contatti con il contatto selezionato
Cursor cursor = getContentResolver().query(data.getData(),
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) { // True se il cursore è non vuoto
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
String name = cursor.getString(columnIndex);
// Fa qualcos’altro...
}
}
}
23