Android Studio - comunicazione e coordinamento tra Activity
Android Studio – Comunicazione e Coordinamento tra Activity
Le Activity iniziano a comunicare tra Loro, prendono il Loro vita
Le Activity possono comunicare con altre APP
Coordinamento: quando un’Activity ne avvia un’altra, l’altra Activity avviata avrà il Suo ciclo di vita. Activity1 → AVVIA → Activity2
Non possiamo determinare lo Stato o eventualmente capire in che Stato siamo.
Il Ciclo di Vita dell’Activity, sicuramente è sempre Coerente.
Partenza Activity
Si crea un oggetto INTENT e poi si passa la nuova Activity che vogliamo far partire
Intent passoiDati = new Intent(MainActivity.this, MainActivity2.class);
startActivity(passoiDati);
Per inviare una mail?
// Bottone per inviare mail
Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Bottone per azionare l'invio di una mail
button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent invioMail = new Intent(Intent.ACTION_SEND);
invioMail.putExtra(Intent.EXTRA_EMAIL, "");
startActivity(invioMail);
}
});
potrebbe esserci la possibilità di chiedere i Permessi
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent invioMail = new Intent(Intent.ACTION_SEND);
// Intent è capace di rispondere a quest'azione --> Intent.ACTION_SEND
invioMail.putExtra(Intent.EXTRA_EMAIL, "");
startActivity(invioMail);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent invioMail = new Intent(Intent.ACTION_SEND);
// Intent è capace di rispondere a quest'azione --> Intent.ACTION_SEND
invioMail.putExtra(Intent.EXTRA_EMAIL, "");
// con putExtra, gli do un input dei Dati
startActivity(invioMail);
}
});
Il buon codice:
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent invioMail = new Intent(Intent.ACTION_SEND);
// Intent è capace di rispondere a quest'azione --> Intent.ACTION_SEND
invioMail.putExtra(Intent.EXTRA_EMAIL, "");
// all'interno di Value, metto il contenuto della Mail che voglio inviare
// con putExtra, gli do un input dei Dati
startActivity(invioMail);
}
});
l’Activity è responsabile per il risultato, restituito all’Activity chiamante
Activity.SetResult
serve per fare dei controlli. Fa dei controllo sullo stato dell’Activity per capire se può rimuoverla o farci qualcosa.
Gestione Intent
Intent, intenzione di far qualcosa. E’ una funzionalità di O.S. Android
Intent: oggetto (ha una Classe, una Libreria) che scambia messaggi tra Componenti di App
E’ usato per:
far partire un’Activity
far partire un Service
mandare un messaggio in Broadcast
L’intent è il mezzo con cui programmare queste comunicazioni.
- Fa partire un’Activity, quindi ne crea una nuova (passandogli il Bundle, passandogli dei parametri)
- può far partire un Service (un caso particolare di Activity)
Per far funzionare le Activity, si usano questi metodi:
startActivity()
startActivityForResult()
onActivityResult()
O.S. Android comunica tramite scambio di messaggi, principalmente.
O.S. Android, permette di inviare messaggi, di inviare richieste, tramite App che girano nel sistema.
E’ bene capire il funzionamento delle Intent
Service o meglio i Services sono Activity, ma sono indipendenti. Servono per far partire delle operazioni, dei programmi in modo trasparente.
E’ indipende dal Ciclo di Vita dell’Activity
Il Servizio (Service) è bene che comunichi con O.S. Android
Intent: implicito ed esplicito
Intent Esplicito: si specificano le componenti. Noi conosciamo le Componenti. Sappiamo il nome della Classe da istanziare o la Componente da far partire
Intent Implicito: non chiama una Componente specifica, ma dichiarano un’azione. Io devo fare un’azione, mi dici come posso far quest’azione.
Ho un messaggio da far partire verso l’O.S. Android, tu O.S. Android mi dici come fare?
Ho il messaggio, trovami tu la soluzione.
E’ possibile pensare a Livello di Application Framework (Le Varie Classi del Sistema Operativo Android che ci permettono di far funzionare da O.S. Android tutte le Applicazioni) o a livello di Applications (quindi, APP già create da Sviluppatori)
Devo far un’azione, tu Sistema Operativo, mi suggerisci, hai una componente o una Classe che mi permette di far quest’azione (Intent Implicito).
So che ci sono App nell’O.S. Android che sanno fare quest’azione e allora invoco, tramite Intent Implicito, l’azione. Se avessi del contenuto da condividere, si crea l’Intent con l’azione ACTION_SEND che specifica il contenuto da condividere.
Per assicurarsi che l’Intent venga processato si usa resolveActivity()
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent invioMail = new Intent(Intent.ACTION_SEND);
// Intent è capace di rispondere a quest'azione --> Intent.ACTION_SEND
invioMail.putExtra(Intent.EXTRA_EMAIL, "");
// all'interno di Value, metto il contenuto della Mail che voglio inviare
// con putExtra, gli do un input dei Dati
if (invioMail.resolveActivity(getPackageManager()) != null)
{
startActivity(invioMail);
}
startActivity(invioMail);
}
});
Come si gestisce un Intent Implici? Nell’AndroidManifest.XML si dichiarano degli Intent Impliciti.
Ogni Intent dice nell’intent Filter, quello che sa fare, fondamentalmente.
Ciascun Intent, specifica il tipo di Intent che l’app può processare del tipo
<action>
<data>
<category>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Intent Filter è dichiarato nell’AndroidManifest.XML, nell’Activity:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Intent Filter contiene:
<action>
<data>
il tipo di Dato, ad esempio URI
<category>
Gestione Intent Impliciti
Activity → Lancia → startActivity( INTENT)
O.S Android ha tutti gli AndroidManifest.XML delle App installate. Ricordiamoci che nell’Application Framework chi tiene traccia delle App installate sul dispositivo è Package Manager.
O.S Android, assume il compito di trovare l’Activity appropriata per gestire l’Intent Specifico.
C’è un confronto da parte dell’O.S. Android per capire dall’AndroidManifest.XML e capire quali rispondono alla richiesta.
Quali sono quindi gli AndroidManifest.XML che rispondono alla richiesta degli Intent, mandato in modo esplicito e il Sistema Operativo Android avvia l’Intent di risposta.
Tutto questo, l’Intent Implicito da mandare in onCreate(), L’activity che deve rispondere.
O.S. Android si prende la briga di capire chi deve far qualcosa.
ActivityA → startActivity() → Intent → Android System → Intent → onCreate()
O.S. Android ha il compito di capire per quanto riguarda gli Intent Impliciti, di capire chi deve e chi deve rispondere a cosa. Quale Classe deve rispondere e a cosa?
l’AndroidManifest.XML è importante perché descrive cosa fa l’APP e cosa richiede di fare. O.S. Android ha la visione globale di ciò che gira al suo interno e può rispondere agli intent impliciti.
Rispondere agli Intent di O.S. Android, facendo il confronto e quindi:
O.S Android che si prende il compito di trovare un’Activity appropriata per gestire l’Intent implicito (ricordando che é quello scambio di messaggi, in cui: non conosciamo la Classe o la Componente, ma conosciamo il messaggio). Essendo l’O.S. Android che si prende il compito di trovare un’Activity appropriata, quest’operazione lo fa tramite il confronto con gli intent filter dell’AndroidManifest.xml
<activity android:name=".MainActivity2">
</activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Essendo l’O.S. Android che si prende il compito di trovare un’Activity appropriata, quest’operazione lo fa tramite il confronto con gli intent filter dell’AndroidManifest.xml
Rispondere a un Intent attraverso il confronto con gli intent filter, si chiama Intent Resolution
L’O.S. Android cerca la migliore Activity in base al Tag <Action>, <Category>, <Filter>
Azione accettate? <Action>
Categorie accettate? <Category>
Dati Accettati? <Data>