Intent-uri si Stocarea Datelor

Baze de date

SQLite este o bibliotecă C care implementează un motor de baze de date SQL încapsulat.

In acest laborator nu vom discuta despre SQLite, dar daca vreti sa folositi, gasiti un laborator bine explicat aici.

Shared Preferences

Exemplu de salvare si restaurare a unei date folosind Shared Preferences

public class Example extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";
 
    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .
 
       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       String s=settings.getString("cheie","valoare_default");
    }
 
    @Override
    protected void onStop(){
       super.onStop();
 
      // We need an Editor object to make preference changes.
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);
 
      // Commit the edits!
      editor.commit();
    }
}

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

Pentru a tranfera date intre activitati putem folsi obiectul de tip Bundle asociat fiecarui intent. Acesta retine perechi de tipul cheie-valoare.

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

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

  • Modificati aplicatia realizata in cadrul laboratorului precedent astfel incat, in loc sa aveti in aceasi activitate interfata de adaugare, sa deschideti o activitate noua unde utilizatorul sa introduca datele necesare.
  • In aceasta a doua activitate includeti si un buton de back
  • In activitatea principala, atunci cand utilizatorul apasa pe unul din item-uri deschideti intr-un browser pagina producatorului.

Bonus

  • Permiteti utilizatorului sa incarce din a doua activitate o imagine pentru masina respectiva.
programare_android/curs/curs4.txt · Ultima modificare: 2013/08/05 09:22 de către stefan.alexandru
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