Intent-uri

Folosim intent-uri pentru a face legatura intre Activitati. Putem porni atat activitati din aplicatia noasta cat si activitati din alte aplicatii. Mai multe despre intent-uri gasiti aici aici

Utilizare

Exemplul cel mai folosit este

 Intent intent= new Intent (ActivitateParinte.this, ActivitateCopil.class);
startActivity(intent);

echivalent cu

 Intent intent = new intent();
intent.setClass(ActivitateParinte.this, ActivitateCopil.class);
startActivity(intent);

Nu uitati ca ambele activitati trebuie sa existe in manifest

Play a sound

Mai sus am avut un exemplu pentru pornirea activitatilor din aplicatia noasta. In continuare avem un exemplu in care folosim un intent pentru a deschide alte aplicatii.

package ...
imports...


public class MainActivity extends Activity {
	   int ACTIVITY_RECORD_SOUND = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Intent intent = new Intent();
      
        intent.setType("audio/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,
                "Select Sound"),ACTIVITY_RECORD_SOUND );
        
       /* 
     
        Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
        startActivityForResult(intent, ACTIVITY_RECORD_SOUND);
       */ 
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == ACTIVITY_RECORD_SOUND ) {
                Uri selectedSoundUri = data.getData();
        play(selectedSoundUri);
          
    
            }
        
       
    }}
    
    
    
    
    public void play(Uri uri)
    {
    	
    	
    	  MediaPlayer mp = new MediaPlayer(); 
          try {
              mp.setDataSource(getPath(uri)); 
              mp.prepare();
          } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } 
          mp.start();

    	
    	
    }
    
    
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Audio.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

}

Filtre de Intent-uri

Pentru fiecare activitate putem declara in manifest cu ce Intent-uri poate fi pornita. Putem stabili:

  • actiunea
  • categoria
  • tipul

Exemplul urmator ilustreaza o activitate ce raspunde la actiunile EDIT si VIEW pentru tipul image/jpeg din categoria DEFAULT.

        <activity android:name=".ImageActivity"
                  android:label="Image Activity">
            <intent-filter>
                <action android:name="android.intent.action.EDIT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:nameType="image/jpeg"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:nameType="image/jpeg"/>
            </intent-filter>
        </activity>

Transmiterea datelor prin intent-uri

În multe situații, activitatea nouă are nevoie de niște parametri provenind din prima activitate. Acești parametri sunt pasați cu
ajutorul metodei putExtra(String nume, valoare) si sunt sub forma de perechi de tipul cheie-valoare.. Valoarea pasată poate să fie de aproape orice tip.

// construim un Intent
Intent intent = new Intent (this,ActivitateDePornit.class );

// adaugam doua date, un String cu cheia "nume" si un numar cu cheia "numar"
intent.putExtra("nume", "Gigel");
intent.putExtra("numar", 10);

//pornim activitatea

startActivity (intent); 

In activitatea pornita, preluam parametrii in felul urmator:

// preluam Intent-ul care ne-a pornit
Intent intent = getIntent ();

// preluam parametrii
String nume = intent.getStringExtra("nume");
int numar = intent.getIntExtra("numar", 0);

// afisam in log parametrii primiti
Log.d ("intent", "nume: "+nume);
Log.d ("intent", "nume: "+numar);

Activitatea nou creată va lua un pointer spre variabila intent cu ajutorul funcției getIntent(). După aceea, cu ajutorul metodei getExtra(nume), se vor obține parametri transmiși. În funcție de tipul variabilei care se dorește obținută, există funcții precum: getStringExtra, getBundleExtra,
getByteExtra etc. O abordare mai generică este cu ajutorul funcției getExtras care returnează o variabilă de tip Bundle din care se va extrage variabila de tipul dorit.

Asteptarea unui raspuns

De multe ori apar situatii in care o fereastra trebuie sa intoarca niste date ferestrei care a pornit-o. De exemplu, avem un program ce pastreaza o lista de filme. Dorim sa adaugam un film nou, dar cum formularul de adaugare este mai mare, dorim sa cream o fereastra noua in care sa putem introduce informatii. Astfel, utilizatorul apasa pe butonul Adaugare, se deschide o fereatsra noua, utilizatorul completeaza datele noului film si apasa Adauga. Fereastra cu formularul se inchide si trimite datele inapoi fereastrei cu lista. Implementarea se face astfel:

Codul pentru butonul Adaugare din lista de filme:

Intent adauga = new Intent (ListaFilme.this, FormularAdaugare.class);


// pronim activitatea si specificam ca dorim un raspuns
// 100 este request code-ul, utilitatea lui fiind sa deosebim intre raspunsurile primite, atunci cand asteptam dupa mai multe cereri asincrone

startActivityForResult (adauga, 100);

Intoarcerea datelor se face prin intermediul unui obiect de tip Intent. Astfel, fereastra cu formularul va crea un nou Intent si il va trimite drept raspuns fereastrei cu lista.

Codul pentru butonul Adauga din formular este:

// cream obiectul de raspuns
Intent raspuns = new Intent ();

// setam parametrii
raspuns.putExtra ("nume", nume.getText().toString());
raspuns.putExtra ("an", Integer.parseInt (an.getText().toString()));
raspuns.putExtra ("regizor", regizor.getText().toString());

// setam codul de raspuns, 1 reprezinta succes, 0 fail -  daca aveam un buton de anulare, la apasarea lui am fi setat result code-ul 0

setResult (1, raspuns);

// inchidem formularul
finish ();

In activitatea cu lista de filme, vom suprascrie functie onActivityResult(…). Functia este apelata pentru orice activitate care intoarce un rezultat catre lista de filme (formular de adaugare, formular de modficare etc.), iar selectia se face dupa requestCode.

    @Override
    public void onActivityResult (int requestCode, int responseCode, Intent data)
    {
    	// raspunsul vine de la formularul de adaugare
    	
    	if (requestCode == 100)
    	{
    		// s-a apasat butonul Adauga
    		if (responseCode==1)
    		{
    			String nume = data.getStringExtra("nume");
    			int an = data.getIntExtra("an", 0);
    			String regizor = data.getStringExtra("regizor");
    			
    			// adaptor.adaugaFilm (nume, an, regizor);
    		}
    		// s-a apasat butonul Renunta
    		else if (responseCode==0)
    		{
    		}
    	}
    }

Exercitii

  1. Imbunatatiti aplicatia constand intr-un formular de inscriere la IPW astfel incat la apasarea butonului de Save sa se deschida o noua fereastra care sa afiseze un rezumat al raspunsurilor.
  2. Adaugati formularului un buton de Alte comentarii la a carui apasare sa se deschida o fereastra in care participantul sa poata sa adauge alte observatii legate de inscriere. La apasarea butonului Save, cea de-a doua fereastra trebuie sa afiseze si acele observatii.
  3. Adaugati formularului un buton la a carui apasare sa se deschida in browser pagina IPW.

Bonus

  1. Adaugati formularului posibilitatea ca participantul sa isi adauge o poza de profil.
programare_android15/curs/curs4.txt · Ultima modificare: 2015/08/08 11:45 de către ioana.culic
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0