mercoledì 9 febbraio 2011

Android Base: Un esempio di Intent Esplicito.

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