Android Studio – Comunicazione tra Activity

Android Studio – Comunicazione tra Activity

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>

<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>

Ho trovato grazie all’intent Filter un’Activity, che può rispondere all’Intent Resolution, perché è proprio formattata in questo modo

Quindi: grazie all’Intent Filter, la scelta è ben selezionata. Il Sistema Operativo, dice: ora ti avvio l’Activity che ti serve.

Intent Impliciti e sicurezza

E’ bene per una questione di sicurezza, richiamare sempre Intent Espliciti

E’ bene cercare di non mettere Intent Impliciti se non è necessario. Da ricordare che gli Intent Impliciti sono gli Intent dichiarati nell’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>

Dove c’è <intent-filter> inizia il ciclo dell’Intent Implicito

Se sappiamo di risolvere un Intent Esplicitamente è bene non mettere l’Intent Implicito.

Se usassimo l’Intent Implicito, O.S. Android ci darà l’elenco delle App che potrebbero rispondere alla nostra Richiesta, ma Non siamo mai sicuro di quale servizio possa rispondere.

Se possiamo rispondere con Intent Esplicito è meglio dell’Intent Implicito.

O.S. Android, quando riceve una richiesta di Intent Implicito, fa compire un elenco di possibili App che possano in qualche modo rispondere all’Intent Implicito

Esempio: se volessimo aprire una Pagina web, sicuramente con l’intent implicito, l’O.S. Android, ci da una gran Lista di APP

Regola: un Intent Implicito non può chiamare un Service (il Service è un’Activity particolare/speciale ma senza interfaccia).

Nell’AndroidManifest.XML, oltre all’intent Filter che dicono (cosa vuoi fare nell’App), c’è la richiesta dei permessi. O.S. Android chiede agli utenti la gestione dei permessi.

Se volessimo accedere alla Rubrica, per poterlo fare dovremmo chiedere dei Permessi: L’utente quindi se ne accorge se Noi abbiamo cattive intenzioni o vogliamo in un certo qual modo, compiere azioni strane.

I Permessi dove vanno messi? Nell’AndroidManifest.XML

Se non dovessi mettere i permessi? Non otterremo quel tipo di azione tanto desiderata.

Creazione Intent: assegnare un “Nome”

Per la creazione dell’intent si assegna un nome alla Componente da far partire

Se non c’è il nome, si intende Intent Implicito

E’ possibile lanciare un Service (Servizio) con un Intent Implicito? No! Non si può!

E’ bene star attenti al Package con cui si registra L’app. Ad esempio: com.example.ExpleActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MainActivity", "onCreate()");

button = (Button) findViewById(R.id.button);
editText = (EditText) findViewById(R.id.editText);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// suo delle Intent
Intent altraActivity = new Intent(MainActivity.this, MainActivity2.class);
startActivity(altraActivity);
}
});

Noi conosciamo la Componente che stiamo chiamando, MainActivity2.class

E’ un intent esplicito.

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Log.d("MainActivity2", "onCreate()");

button2 = (Button) findViewById(R.id.button2);

button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// E' bene chiamare la Intent
Intent tornaIndietro = new Intent(MainActivity2.this, MainActivity.class);
startActivity(tornaIndietro);
}
});
}

Se siamo nell’Activity2 e vorremmo tornare nell’Activity principale

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// mantiene i riferimenti alla User interface (U.I.)
editName = (EditText) findViewById(R.id.editName);
editSurname = (EditText) findViewById(R.id.editSurname);
button = (Button) findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nome = editName.getText().toString();
String cognome = editSurname.getText().toString();
// E' bene creare la chiamata --> Intent
// in questo modo, riusciamo a passare i dati all'Activity2
// ovviamente questo per definizione è un Intent Esplicito
// Noi conosciamo la Classe, La componente da richiamare --> Activity2
Intent passoiDati = new Intent(MainActivity.this, MainActivity2.class);
passoiDati.putExtra("NAME", nome);
passoiDati.putExtra("COGNOME", cognome);
startActivity(passoiDati);
}
});

TextView riceveNome, riceveCognome;
Button button2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);

riceveNome = (TextView) findViewById(R.id.riceveNome);
riceveCognome = (TextView) findViewById(R.id.riceveCognome);
button2 = (Button) findViewById(R.id.button2);

// Ovviamente per ricevere i Dati dall'Activity2, si usa
// getIntent()
// si assegnano in questo caso due stringhe

Intent riceviDati = getIntent();
String nome = riceviDati.getStringExtra("NAME");
String cognome = riceviDati.getStringExtra("COGNOME");

// riceveNome e riceveCognome sono due TextView
riceveNome.setText(nome);
riceveCognome.setText(cognome);

Un altro modo di utilizzare la Intent per inviare una Mail

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);
}
});

I Vari Intent:

Intent altraActivity = new Intent(MainActivity.this, MainActivity2.class);

String nome = editNome.getText().toString();
String cognome = editCognome.getText().toString();
int eta = Integer.parseInt(editEta.getText().toString());
// E' bene creare la chiamata --> Intent
// in questo modo, riusciamo a passare i dati all'Activity2
// ovviamente questo per definizione è un Intent Esplicito
// Noi conosciamo la Classe, La componente da richiamare --> Activity2
Intent passoiDati = new Intent(MainActivity.this, MainActivity2.class);
passoiDati.putExtra("NAME", nome);
passoiDati.putExtra("COGNOME", cognome);
passoiDati.putExtra("ETA", eta);
startActivity(passoiDati);

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);

Posso ovviamente crearmi la mia Intent personalizzata

Creazione Intent: gestione Category (documentazione)

E’ bene associare una Category a una Intenet (ed é bene vedere la documentazione)

About Post Author

pasquale.clarizio

error: Content is protected !!
Advertisment ad adsense adlogger