In un’Intent Esplicito specifichiamo l’Activity target invocandola direttamente. Tale gestione è utile nel caso si vogliano gestire messaggi all’interno delle proprie applicazioni.
A differenza delle Intent Implicite in cui dichiariamo il tipo di Intent che vogliamo sia gestita e deleghiamo alla piattafroma Android il compito di trovare l’Activity in grado di operare sui dati di cui abbiamo bisogno, ora definiamo a tempo di compilazione chi sarà ad “occuparsi dei nostri dati”.
Chiarirò tutto con un semplice esempio.
Supponiamo di avere due Activity:
· InvokeActivity
· InvokedActivity
Che, ovviamente, rappresentano l’Activity chiamante e quella chiamata.
Partiamo dalla definizione della nostra applicazione col seguente AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.delfio.android.activity.intents" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".InvokeActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".InvokedActivity" android:label="@string/app_name"> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> |
|
L’InvokeActivity contiene un bottone “Invoca Activity” (da inserire nel file xml di layout: main.xml) che, una volta cliccato, permette di invocare l’Activity target.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/testoInvokeActivity" android:layout_weight="1"/> <Button android:text="@string/invokeButtonText" android:id="@+id/invokeButton" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> |
|
Di seguito il codice dell’InvokeActivity con in evidenza la gestione dell’evento onClick lanciato alla pressione del bottone con id invokeButton
package it.delfio.android.activity.intents; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class InvokeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button invokeButton = (Button)findViewById(R.id.invokebutton); invokeButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent explicitIntent = new Intent(InvokeActivity.this,InvokedActivity.class); startActivity(explicitIntent); } }); } } |
|
Recuperiamo il pulsante che permetterà di lanciare il nostro Intent attraverso l’istruzione:
(Button)findViewById(R.id.invokebutton)
Di seguito, attraverso il costruttore :
Intent(InvokeActivity.this,InvokedActivity.class)
Possiamo specificare l’Activity sorgente e quella destinazione della chiamata, che verrà fatta sempre attraverso la chiamata:
startActivity(explicitIntent);
Definiamo nel file /res/values/string.xml tutte le stringhe che utilizzaremo nell’applicazione:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="testoInvokeActivity">Activity che lancia una Intent Esplicita</string> <string name="app_name">Prova Intent Esplicita</string> <string name="invokeButtonText">Invoca Activity </string> <string name="testoInvokedActivity">Activity chiamata esplicitamente. Non abbiamo configurato nessun Intent Filter, quindi per invocare la seconda Activity bisogna chiamarla esplicitamente.</string> </resources> |
|
Alla pressione del bottone, come accennato in precedenza viene lanciata l’Intent a cui risponderà la nostra seconda InvokedActivity, il cui layout è definito dal file:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="@string/testoInvokedActivity" android:layout_width="fill_parent" android:layout_height="wrap_content" > </TextView> </LinearLayout> |
|
Che contiene un unico campo testo da visualizzare appena viene invocata e visualizzata attraverso il semplice codice:
package it.delfio.android.activity.intents; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class InvokedActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.invokedactivity); } } |
|
Infine, provando a lanciare la nostra semplice applicazione sull’emulatore, dovremmo ottenere:
Nessun commento:
Posta un commento